diff options
author | Simon MacMullen <simon@rabbitmq.com> | 2012-02-01 15:06:04 +0000 |
---|---|---|
committer | Simon MacMullen <simon@rabbitmq.com> | 2012-02-01 15:06:04 +0000 |
commit | 2d6e33f14a5a4bf187b57810bd2802b25274d9ba (patch) | |
tree | dcafd650dc4069c41363e3f6b52e2fe389a87fd5 /src | |
parent | 30cf1f62f0659ab4c3c77f5b71627d11b7277dae (diff) | |
download | rabbitmq-server-2d6e33f14a5a4bf187b57810bd2802b25274d9ba.tar.gz |
But Matthias points out that we can avoid the three-way-ness by changing the meaning of non-forced clustering so that you must only have to contact *one* disc node. This seems to work.
Diffstat (limited to 'src')
-rw-r--r-- | src/rabbit_mnesia.erl | 49 | ||||
-rw-r--r-- | src/rabbit_upgrade.erl | 2 |
2 files changed, 17 insertions, 34 deletions
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl index 138dad5e..75ad3dc8 100644 --- a/src/rabbit_mnesia.erl +++ b/src/rabbit_mnesia.erl @@ -46,8 +46,7 @@ -spec(dir/0 :: () -> file:filename()). -spec(ensure_mnesia_dir/0 :: () -> 'ok'). -spec(init/0 :: () -> 'ok'). --spec(init_db/3 :: ([node()], 'all' | 'some' | 'none', - rabbit_misc:thunk('ok')) -> 'ok'). +-spec(init_db/3 :: ([node()], boolean(), rabbit_misc:thunk('ok')) -> 'ok'). -spec(is_db_empty/0 :: () -> boolean()). -spec(cluster/1 :: ([node()]) -> 'ok'). -spec(force_cluster/1 :: ([node()]) -> 'ok'). @@ -100,10 +99,7 @@ init() -> ensure_mnesia_running(), ensure_mnesia_dir(), Nodes = read_cluster_nodes_config(), - ok = init_db(Nodes, case should_be_disc_node(Nodes) of - true -> none; - false -> some - end), + ok = init_db(Nodes, should_be_disc_node(Nodes)), %% 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. @@ -178,10 +174,7 @@ cluster(ClusterNodes, Force) -> %% Join the cluster start_mnesia(), try - ok = init_db(ClusterNodes, case Force of - true -> none; - false -> all - end), + ok = init_db(ClusterNodes, Force), ok = create_cluster_nodes_config(ClusterNodes) after stop_mnesia() @@ -507,9 +500,9 @@ delete_previously_running_nodes() -> FileName, Reason}}) end. -init_db(ClusterNodes, RequiredNodes) -> +init_db(ClusterNodes, Force) -> init_db( - ClusterNodes, RequiredNodes, + ClusterNodes, Force, fun () -> case rabbit_upgrade:maybe_upgrade_local() of ok -> ok; @@ -521,32 +514,22 @@ init_db(ClusterNodes, RequiredNodes) -> %% Take a cluster node config and create the right kind of node - a %% standalone disk node, or disk or ram node connected to the -%% specified cluster nodes. RequiredDiscNodes determines how many disc -%% nodes must be up for us to succeed - 'none' (used when forcing -%% cluster or starting a disc node), 'some' (used when starting a RAM -%% node) or 'all' (used when non-forced clustering). -init_db(ClusterNodes, RequiredDiscNodes, SecondaryPostMnesiaFun) -> +%% specified cluster nodes. If Force is false, don't allow +%% connections if all disc nodes are offline and we are a RAM node. +init_db(ClusterNodes, Force, SecondaryPostMnesiaFun) -> UClusterNodes = lists:usort(ClusterNodes), ProperClusterNodes = UClusterNodes -- [node()], case mnesia:change_config(extra_db_nodes, ProperClusterNodes) of {ok, Nodes} -> - FailedDiscNodes = ProperClusterNodes -- Nodes, - OK = case {FailedDiscNodes, Nodes, RequiredDiscNodes} of - {[], _, all} -> true; - {_, _, all} -> false; - {_, [], some} -> false; - {_, _, some} -> true; - {_, _, none} -> true - end, - case OK of - true -> ok; - false -> throw({error, {failed_to_cluster_with, - FailedDiscNodes, - "Mnesia could not connect " - "to some nodes."}}) + case {Nodes, Force} of + {[], false} -> throw({error, {failed_to_cluster_with, + ProperClusterNodes, + "Mnesia could not connect " + "to any disc nodes."}}); + _ -> ok end, - WantDiscNode = should_be_disc_node(ClusterNodes), WasDiscNode = is_disc_node(), + WantDiscNode = should_be_disc_node(ClusterNodes), %% We create a new db (on disk, or in ram) in the first %% two cases and attempt to upgrade the in the other two case {Nodes, WasDiscNode, WantDiscNode} of @@ -763,7 +746,7 @@ reset(Force) -> try %% Force=true here so that reset still works when clustered %% with a node which is down - ok = init_db(read_cluster_nodes_config(), none), + ok = init_db(read_cluster_nodes_config(), true), {all_clustered_nodes() -- [Node], running_clustered_nodes() -- [Node]} after diff --git a/src/rabbit_upgrade.erl b/src/rabbit_upgrade.erl index 776da90d..717d94a8 100644 --- a/src/rabbit_upgrade.erl +++ b/src/rabbit_upgrade.erl @@ -223,7 +223,7 @@ secondary_upgrade(AllNodes) -> false -> AllNodes -- [node()] end, rabbit_misc:ensure_ok(mnesia:start(), cannot_start_mnesia), - ok = rabbit_mnesia:init_db(ClusterNodes, none, fun () -> ok end), + ok = rabbit_mnesia:init_db(ClusterNodes, true, fun () -> ok end), ok = rabbit_version:record_desired_for_scope(mnesia), ok. |