summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2012-02-01 15:06:04 +0000
committerSimon MacMullen <simon@rabbitmq.com>2012-02-01 15:06:04 +0000
commit2d6e33f14a5a4bf187b57810bd2802b25274d9ba (patch)
treedcafd650dc4069c41363e3f6b52e2fe389a87fd5
parent30cf1f62f0659ab4c3c77f5b71627d11b7277dae (diff)
downloadrabbitmq-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.
-rw-r--r--src/rabbit_mnesia.erl49
-rw-r--r--src/rabbit_upgrade.erl2
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.