summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2012-02-01 14:52:57 +0000
committerSimon MacMullen <simon@rabbitmq.com>2012-02-01 14:52:57 +0000
commit30cf1f62f0659ab4c3c77f5b71627d11b7277dae (patch)
tree2df21c0376cdd122477d6ae1cbd3e7f853ebf8f3
parent28afc69c35fcb9663a4a4d19e1be5c0080ec97bf (diff)
downloadrabbitmq-server-30cf1f62f0659ab4c3c77f5b71627d11b7277dae.tar.gz
Reintroduce the three levels of forcedness. We do still need it.
-rw-r--r--src/rabbit_mnesia.erl48
-rw-r--r--src/rabbit_upgrade.erl2
2 files changed, 34 insertions, 16 deletions
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl
index cfa8f237..138dad5e 100644
--- a/src/rabbit_mnesia.erl
+++ b/src/rabbit_mnesia.erl
@@ -46,7 +46,8 @@
-spec(dir/0 :: () -> file:filename()).
-spec(ensure_mnesia_dir/0 :: () -> 'ok').
-spec(init/0 :: () -> 'ok').
--spec(init_db/3 :: ([node()], boolean(), rabbit_misc:thunk('ok')) -> 'ok').
+-spec(init_db/3 :: ([node()], 'all' | 'some' | 'none',
+ rabbit_misc:thunk('ok')) -> 'ok').
-spec(is_db_empty/0 :: () -> boolean()).
-spec(cluster/1 :: ([node()]) -> 'ok').
-spec(force_cluster/1 :: ([node()]) -> 'ok').
@@ -98,7 +99,11 @@ status() ->
init() ->
ensure_mnesia_running(),
ensure_mnesia_dir(),
- ok = init_db(read_cluster_nodes_config(), false),
+ Nodes = read_cluster_nodes_config(),
+ ok = init_db(Nodes, case should_be_disc_node(Nodes) of
+ true -> none;
+ false -> some
+ end),
%% 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.
@@ -173,7 +178,10 @@ cluster(ClusterNodes, Force) ->
%% Join the cluster
start_mnesia(),
try
- ok = init_db(ClusterNodes, Force),
+ ok = init_db(ClusterNodes, case Force of
+ true -> none;
+ false -> all
+ end),
ok = create_cluster_nodes_config(ClusterNodes)
after
stop_mnesia()
@@ -499,9 +507,9 @@ delete_previously_running_nodes() ->
FileName, Reason}})
end.
-init_db(ClusterNodes, Force) ->
+init_db(ClusterNodes, RequiredNodes) ->
init_db(
- ClusterNodes, Force,
+ ClusterNodes, RequiredNodes,
fun () ->
case rabbit_upgrade:maybe_upgrade_local() of
ok -> ok;
@@ -513,21 +521,31 @@ init_db(ClusterNodes, Force) ->
%% 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. 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) ->
+%% 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) ->
UClusterNodes = lists:usort(ClusterNodes),
ProperClusterNodes = UClusterNodes -- [node()],
case mnesia:change_config(extra_db_nodes, ProperClusterNodes) of
{ok, Nodes} ->
- WantDiscNode = should_be_disc_node(ClusterNodes),
- case Nodes =:= [] andalso not WantDiscNode andalso not Force of
- false -> ok;
- true -> throw({error, {failed_to_cluster_with,
- ProperClusterNodes,
+ 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 any disc nodes."}})
+ "to some nodes."}})
end,
+ WantDiscNode = should_be_disc_node(ClusterNodes),
WasDiscNode = is_disc_node(),
%% We create a new db (on disk, or in ram) in the first
%% two cases and attempt to upgrade the in the other two
@@ -745,7 +763,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(), true),
+ ok = init_db(read_cluster_nodes_config(), none),
{all_clustered_nodes() -- [Node],
running_clustered_nodes() -- [Node]}
after
diff --git a/src/rabbit_upgrade.erl b/src/rabbit_upgrade.erl
index 717d94a8..776da90d 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, true, fun () -> ok end),
+ ok = rabbit_mnesia:init_db(ClusterNodes, none, fun () -> ok end),
ok = rabbit_version:record_desired_for_scope(mnesia),
ok.