diff options
| author | Matthew Sackman <matthew@rabbitmq.com> | 2010-08-10 18:38:15 +0100 |
|---|---|---|
| committer | Matthew Sackman <matthew@rabbitmq.com> | 2010-08-10 18:38:15 +0100 |
| commit | de3e45690f2d4b5bbe9fe33d26ebd7ad490955c8 (patch) | |
| tree | f3c85f8a260f16794954c551589e800a7c7dc510 /src | |
| parent | d89a35b5351c6212f41645b8b102b4671e10ffca (diff) | |
| download | rabbitmq-server-git-de3e45690f2d4b5bbe9fe33d26ebd7ad490955c8.tar.gz | |
Partial implementation of 3rd suggestion. Partial because I just wanted to see the shape of it rather than implement the whole thing and then possibly have to revoke it. IMO, testing on the deep structure of terms is likely sufficient
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_mnesia.erl | 52 |
1 files changed, 43 insertions, 9 deletions
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl index 505dc28fe8..de6b06421f 100644 --- a/src/rabbit_mnesia.erl +++ b/src/rabbit_mnesia.erl @@ -157,26 +157,45 @@ table_definitions() -> [{rabbit_user, [{record_name, user}, {attributes, record_info(fields, user)}, - {disc_copies, [node()]}]}, + {disc_copies, [node()]}, + {test, fun (#user{}) -> true; + (_) -> false + end}]}, {rabbit_user_permission, [{record_name, user_permission}, {attributes, record_info(fields, user_permission)}, - {disc_copies, [node()]}]}, + {disc_copies, [node()]}, + {test, fun (#user_permission{user_vhost = #user_vhost{}, + permission = #permission{}}) -> true; + (_) -> false + end}]}, {rabbit_vhost, [{record_name, vhost}, {attributes, record_info(fields, vhost)}, - {disc_copies, [node()]}]}, + {disc_copies, [node()]}, + {test, fun (#vhost{}) -> true; + (_) -> false + end}]}, {rabbit_config, [{attributes, [key, val]}, % same mnesia's default - {disc_copies, [node()]}]}, + {disc_copies, [node()]}, + {test, fun ({rabbit_config, _Key, _Value}) -> true; + (_) -> false + end}]}, {rabbit_listener, [{record_name, listener}, {attributes, record_info(fields, listener)}, - {type, bag}]}, + {type, bag}, + {test, fun (#listener{}) -> true; + (_) -> false + end}]}, {rabbit_durable_route, [{record_name, route}, {attributes, record_info(fields, route)}, - {disc_copies, [node()]}]}, + {disc_copies, [node()]}, + {test, fun (#route{binding = #binding{}}) -> true; + (_) -> false + end}]}, {rabbit_route, [{record_name, route}, {attributes, record_info(fields, route)}, @@ -246,12 +265,26 @@ check_schema_integrity() -> Attrs = mnesia:table_info(Tab, attributes), Error = {table_attributes_mismatch, Tab, ExpAttrs, Attrs}, - Attrs /= ExpAttrs + case Attrs of + ExpAttrs -> + {_, Fun} = proplists:lookup(test, TabDef), + not read_test_table(Tab, Fun, + mnesia:dirty_first(Tab)); + _ -> true + end end] of [] -> ok; Errors -> {error, Errors} end. +read_test_table(_Tab, _Fun, '$end_of_table') -> + true; +read_test_table(Tab, Fun, Key) -> + case lists:all(Fun, mnesia:dirty_read(Tab, Key)) of + true -> read_test_table(Tab, Fun, mnesia:dirty_next(Tab, Key)); + false -> false + end. + %% The cluster node config file contains some or all of the disk nodes %% that are members of the cluster this node is / should be a part of. %% @@ -389,11 +422,12 @@ move_db() -> create_tables() -> lists:foreach(fun ({Tab, TabArgs}) -> - case mnesia:create_table(Tab, TabArgs) of + TabArgs1 = proplists:delete(test, TabArgs), + case mnesia:create_table(Tab, TabArgs1) of {atomic, ok} -> ok; {aborted, Reason} -> throw({error, {table_creation_failed, - Tab, TabArgs, Reason}}) + Tab, TabArgs1, Reason}}) end end, table_definitions()), |
