summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@rabbitmq.com>2010-08-10 18:38:15 +0100
committerMatthew Sackman <matthew@rabbitmq.com>2010-08-10 18:38:15 +0100
commitde3e45690f2d4b5bbe9fe33d26ebd7ad490955c8 (patch)
treef3c85f8a260f16794954c551589e800a7c7dc510
parentd89a35b5351c6212f41645b8b102b4671e10ffca (diff)
downloadrabbitmq-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
-rw-r--r--src/rabbit_mnesia.erl52
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()),