summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@rabbitmq.com>2010-11-12 15:45:32 +0000
committerMatthias Radestock <matthias@rabbitmq.com>2010-11-12 15:45:32 +0000
commit7c6d98d78b224a9b489b86f91854f6a95b9fe056 (patch)
treef4688de664b2ff105f238ee334bde123202879fc
parent0e57e76c7c66cee842655b005b0745534cc43cc6 (diff)
downloadrabbitmq-server-7c6d98d78b224a9b489b86f91854f6a95b9fe056.tar.gz
use {error,_} returns and throws instead of exits
-rw-r--r--src/rabbit_mnesia.erl8
-rw-r--r--src/rabbit_upgrade.erl37
2 files changed, 26 insertions, 19 deletions
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl
index 95699c76..331ad120 100644
--- a/src/rabbit_mnesia.erl
+++ b/src/rabbit_mnesia.erl
@@ -378,8 +378,12 @@ init_db(ClusterNodes, Force) ->
%% True single disc node, attempt upgrade
wait_for_tables(),
case rabbit_upgrade:maybe_upgrade() of
- ok -> ensure_schema_ok();
- version_not_available -> schema_ok_or_move()
+ ok ->
+ ensure_schema_ok();
+ version_not_available ->
+ schema_ok_or_move();
+ {error, Reason} ->
+ throw({error, {upgrade_failed, Reason}})
end;
{[], true, _} ->
%% "Master" (i.e. without config) disc node in cluster,
diff --git a/src/rabbit_upgrade.erl b/src/rabbit_upgrade.erl
index 0071a08a..ba06ade8 100644
--- a/src/rabbit_upgrade.erl
+++ b/src/rabbit_upgrade.erl
@@ -32,7 +32,8 @@
-ifdef(use_specs).
--spec(maybe_upgrade/0 :: () -> 'ok' | 'version_not_available').
+-spec(maybe_upgrade/0 :: () -> 'ok' | 'version_not_available' |
+ rabbit_types:error(any())).
-spec(read_version/0 ::
() -> {'ok', [any()]} | rabbit_types:error(any())).
-spec(write_version/0 :: () -> 'ok').
@@ -49,17 +50,17 @@ maybe_upgrade() ->
case read_version() of
{ok, CurrentHeads} ->
G = load_graph(),
- case unknown_heads(CurrentHeads, G) of
- [] ->
- case upgrades_to_apply(CurrentHeads, G) of
- [] -> ok;
- Upgrades -> apply_upgrades(Upgrades)
- end;
- Unknown ->
- exit({future_upgrades_found, Unknown})
- end,
- true = digraph:delete(G),
- ok;
+ try
+ case unknown_heads(CurrentHeads, G) of
+ [] -> case upgrades_to_apply(CurrentHeads, G) of
+ [] -> ok;
+ Upgrades -> apply_upgrades(Upgrades)
+ end;
+ Unknown -> {error, {future_upgrades_found, Unknown}}
+ end
+ after
+ true = digraph:delete(G)
+ end;
{error, enoent} ->
version_not_available
end.
@@ -94,9 +95,11 @@ edges(_Module, Steps) ->
[{Require, StepName} || {StepName, Requires} <- Steps, Require <- Requires].
graph_build_error({vertex, duplicate, StepName}) ->
- exit({duplicate_upgrade, StepName});
-graph_build_error({edge, E, From, To}) ->
- exit({E, From, To}).
+ throw({error, {duplicate_upgrade, StepName}});
+graph_build_error({edge, {bad_vertex, StepName}, _From, _To}) ->
+ throw({error, {dependency_on_unknown_upgrade_step, StepName}});
+graph_build_error({edge, {bad_edge, Path}, _From, _To}) ->
+ throw({error, {cycle_in_upgrade_steps, Path}}).
unknown_heads(Heads, G) ->
[H || H <- Heads, digraph:vertex(G, H) =:= false].
@@ -130,9 +133,9 @@ apply_upgrades(Upgrades) ->
ok = write_version(),
ok = file:delete(LockFile);
{error, eexist} ->
- exit(previous_upgrade_failed);
+ {error, previous_upgrade_failed};
{error, _} = Error ->
- exit(Error)
+ Error
end.
apply_upgrade({M, F}) ->