diff options
| author | Francesco Mazzoli <francesco@rabbitmq.com> | 2012-06-28 15:07:33 +0100 |
|---|---|---|
| committer | Francesco Mazzoli <francesco@rabbitmq.com> | 2012-06-28 15:07:33 +0100 |
| commit | f125bce3926f2ae57e4a7bc4351e10104459de31 (patch) | |
| tree | 7e7786cd69e04d7204121bdcfd0f5c453191087b /src | |
| parent | f4c857dd43b91a88ff9685369e4c7b06a73190cf (diff) | |
| download | rabbitmq-server-git-f125bce3926f2ae57e4a7bc4351e10104459de31.tar.gz | |
`cluster_status_from_mnesia/0' fails if tables are not present
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_mnesia.erl | 49 |
1 files changed, 30 insertions, 19 deletions
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl index 2f7d475457..f3cdd6b2ce 100644 --- a/src/rabbit_mnesia.erl +++ b/src/rabbit_mnesia.erl @@ -125,12 +125,8 @@ prepare() -> init() -> ensure_mnesia_running(), ensure_mnesia_dir(), - %% Here we want the cluster status *file*, not the status from mnesia, - %% because in the case of RAM nodes the status from mnesia doesn't matter. - Status = {AllNodes, _, _} = - rabbit_node_monitor:read_cluster_status_file(), - DiscNode = is_disc_node(Status), - init_db_and_upgrade(AllNodes, DiscNode, DiscNode), + DiscNode = is_disc_node(), + init_db_and_upgrade(all_clustered_nodes(), DiscNode, DiscNode), %% We intuitively expect the global name server to be synced when %% Mnesia is up. In fact that's not guaranteed to be the case - let's %% make it so. @@ -217,11 +213,11 @@ reset(Force) -> true -> all_clustered_nodes(); false -> - AllNodes0 = all_clustered_nodes(), + AllNodes = all_clustered_nodes(), %% Reconnecting so that we will get an up to date nodes %% Force=true here so that reset still works when %% clustered with a node which is down - init_db_with_mnesia(AllNodes0, is_disc_node(), true), + init_db_with_mnesia(AllNodes, is_disc_node(), true), leave_cluster(), rabbit_misc:ensure_ok(mnesia:delete_schema([Node]), cannot_delete_schema), @@ -381,19 +377,34 @@ running_clustered_disc_nodes() -> %% This function is the actual source of information, since it gets the data %% from mnesia. Obviously it'll work only when mnesia is running. cluster_status_from_mnesia() -> - Check = fun (Nodes) -> - case mnesia:system_info(use_dir) of - true -> ordsets:add_element(node(), Nodes); - false -> Nodes - end - end, case mnesia:system_info(is_running) of no -> {error, mnesia_not_running}; - yes -> AllNodes = ordsets:from_list(mnesia:system_info(db_nodes)), - {ok, {AllNodes, - Check(ordsets:from_list( - mnesia:table_info(schema, disc_copies))), - running_nodes(AllNodes)}} + yes -> %% If the tables are not present, it means that `init_db/3' hasn't + %% been run yet. In other words, either we are a virgin node or a + %% restarted RAM node. In both cases we're not interested in what + %% mnesia has to say. + IsDiscNode = mnesia:system_info(use_dir), + Tables = mnesia:system_info(tables), + {Table, _} = case table_definitions(case IsDiscNode of + true -> disc; + false -> ram + end) of [T|_] -> T end, + case lists:member(Table, Tables) of + true -> + AllNodes = + ordsets:from_list(mnesia:system_info(db_nodes)), + DiscCopies = ordsets:from_list( + mnesia:table_info(schema, disc_copies)), + DiscNodes = + case IsDiscNode of + true -> ordsets:add_element(node(), DiscCopies); + false -> DiscCopies + end, + RunningNodes = running_nodes(AllNodes), + {ok, {AllNodes, DiscNodes, RunningNodes}}; + false -> + {error, tables_not_present} + end end. cluster_status() -> |
