diff options
| author | Michael Klishin <mklishin@pivotal.io> | 2019-12-26 15:43:04 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-12-26 15:43:04 +0300 |
| commit | 79fac750d838da3b129ed6260e8d6a711d57d0e4 (patch) | |
| tree | cb28a09b3fedd5a9e11eac54f67a4c944ac5ba42 | |
| parent | 7af37e5bb8bc4a517a6ab26a6038bef6cfa946e7 (diff) | |
| parent | 741b3cff9fc2ffcc0e7f3e21c81568b52ea16f8a (diff) | |
| download | rabbitmq-server-git-79fac750d838da3b129ed6260e8d6a711d57d0e4.tar.gz | |
Merge pull request #2195 from rabbitmq/rabbitmq-server-2194
Handle corrupt or empty virtual host recovery term files
| -rw-r--r-- | src/rabbit_recovery_terms.erl | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/src/rabbit_recovery_terms.erl b/src/rabbit_recovery_terms.erl index 41327147d0..9c0559ea16 100644 --- a/src/rabbit_recovery_terms.erl +++ b/src/rabbit_recovery_terms.erl @@ -193,12 +193,37 @@ code_change(_OldVsn, State, _Extra) -> %%---------------------------------------------------------------------------- +-spec open_table(vhost:name()) -> rabbit_types:ok_or_error(any()). + open_table(VHost) -> + open_table(VHost, 10). + +-spec open_table(vhost:name(), non_neg_integer()) -> rabbit_types:ok_or_error(any()). + +open_table(VHost, RetriesLeft) -> VHostDir = rabbit_vhost:msg_store_dir_path(VHost), File = filename:join(VHostDir, "recovery.dets"), - {ok, _} = dets:open_file(VHost, [{file, File}, - {ram_file, true}, - {auto_save, infinity}]). + Opts = [{file, File}, + {ram_file, true}, + {auto_save, infinity}], + case dets:open_file(VHost, Opts) of + {ok, _} -> ok; + {error, Error} -> + case RetriesLeft of + 0 -> + {error, Error}; + N when is_integer(N) -> + _ = file:delete(File), + %% Wait before retrying + DelayInMs = 1000, + rabbit_log:warning("Failed to open a recovery terms DETS file at ~p. Will delete it and retry in ~p ms (~p retries left)", + [File, DelayInMs, RetriesLeft]), + timer:sleep(DelayInMs), + open_table(VHost, RetriesLeft - 1) + end + end. + +-spec flush(vhost:name()) -> rabbit_types:ok_or_error(any()). flush(VHost) -> try @@ -210,6 +235,8 @@ flush(VHost) -> ok end. +-spec close_table(vhost:name()) -> rabbit_types:ok_or_error(any()). + close_table(VHost) -> try ok = flush(VHost), |
