diff options
| author | Simon MacMullen <simon@rabbitmq.com> | 2010-11-05 15:45:28 +0000 |
|---|---|---|
| committer | Simon MacMullen <simon@rabbitmq.com> | 2010-11-05 15:45:28 +0000 |
| commit | 56252aa5ff9908baa815c18e3e8008db0b529541 (patch) | |
| tree | aa4d56d74f65ee55e587289a2931ea7d278fca2e | |
| parent | 7b3757000960e1957412ff55150198c56fc5b7f1 (diff) | |
| download | rabbitmq-server-git-56252aa5ff9908baa815c18e3e8008db0b529541.tar.gz | |
Check the schema version on disc as well as the integrity check when starting first disc cluster node
| -rw-r--r-- | src/rabbit_mnesia.erl | 44 |
1 files changed, 29 insertions, 15 deletions
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl index 31a91b4dce..4cce2fb64c 100644 --- a/src/rabbit_mnesia.erl +++ b/src/rabbit_mnesia.erl @@ -391,21 +391,34 @@ init_db(ClusterNodes, Force) -> end; {[], true, _} -> %% First disc node in cluster, verify schema - schema_ok_or_move(); + DesiredVersion = rabbit_upgrade:desired_version(), + case rabbit_upgrade:read_version() of + {ok, DiscVersion} -> + case DesiredVersion of + DiscVersion -> + ok; + _ -> + recreate_schema({DesiredVersion, + DiscVersion}) + end, + ok = check_schema_integrity(); + {error, _} -> + schema_ok_or_move() + end; {[], false, _} -> %% First RAM node in cluster, start from scratch ok = create_schema(); {[AnotherNode|_], _, _} -> %% Subsequent node in cluster, catch up - LocalVersion = rabbit_upgrade:desired_version(), - {ok, RemoteVersion} = rpc:call( + DesiredVersion = rabbit_upgrade:desired_version(), + {ok, DiscVersion} = rpc:call( AnotherNode, rabbit_upgrade, read_version, []), - case LocalVersion of - RemoteVersion -> + case DesiredVersion of + DiscVersion -> ok; _ -> - exit({schema_mismatch, LocalVersion, RemoteVersion}) + exit({schema_mismatch, DesiredVersion, DiscVersion}) end, ok = rabbit_upgrade:write_version(), IsDiskNode = ClusterNodes == [] orelse @@ -431,17 +444,18 @@ schema_ok_or_move() -> ok -> ok; {error, Reason} -> - %% NB: we cannot use rabbit_log here since - %% it may not have been started yet - error_logger:warning_msg( - "schema integrity check failed: ~p~n" - "moving database to backup location " - "and recreating schema from scratch~n", - [Reason]), - ok = move_db(), - ok = create_schema() + recreate_schema(Reason) end. +recreate_schema(Reason) -> + %% NB: we cannot use rabbit_log here since it may not have been + %% started yet + error_logger:warning_msg("schema integrity check failed: ~p~n" + "moving database to backup location " + "and recreating schema from scratch~n", [Reason]), + ok = move_db(), + ok = create_schema(). + create_schema() -> mnesia:stop(), rabbit_misc:ensure_ok(mnesia:create_schema([node()]), |
