diff options
author | Matthias Radestock <matthias@rabbitmq.com> | 2010-11-12 15:45:32 +0000 |
---|---|---|
committer | Matthias Radestock <matthias@rabbitmq.com> | 2010-11-12 15:45:32 +0000 |
commit | 7c6d98d78b224a9b489b86f91854f6a95b9fe056 (patch) | |
tree | f4688de664b2ff105f238ee334bde123202879fc | |
parent | 0e57e76c7c66cee842655b005b0745534cc43cc6 (diff) | |
download | rabbitmq-server-7c6d98d78b224a9b489b86f91854f6a95b9fe056.tar.gz |
use {error,_} returns and throws instead of exits
-rw-r--r-- | src/rabbit_mnesia.erl | 8 | ||||
-rw-r--r-- | src/rabbit_upgrade.erl | 37 |
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}) -> |