summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@lshift.net>2010-05-05 14:52:22 +0100
committerMatthew Sackman <matthew@lshift.net>2010-05-05 14:52:22 +0100
commite4579eca831999fc66f0545f7d6af93aa182db19 (patch)
treecda62edc9cee5b806bddc867f0f7f16d3a33aee7
parentc4b64a68e087cea2a1627db45b614cf7aff3549c (diff)
downloadrabbitmq-server-git-e4579eca831999fc66f0545f7d6af93aa182db19.tar.gz
Whoops
-rw-r--r--src/rabbit_msg_store.erl30
1 files changed, 13 insertions, 17 deletions
diff --git a/src/rabbit_msg_store.erl b/src/rabbit_msg_store.erl
index 21fb41c411..5e78544762 100644
--- a/src/rabbit_msg_store.erl
+++ b/src/rabbit_msg_store.erl
@@ -445,29 +445,25 @@ client_read3(Server,
Release = fun() -> ets:update_counter(FileSummaryEts, File,
{#file_summary.readers, -1})
end,
- ReleaseDefer =
- fun () ->
- %% If we get a badarg here, then the GC has finished
- %% and deleted our file. Try going around
- %% again. Otherwise, just defer.
-
- %% badarg scenario: we lookup, msg_store locks, gc
- %% starts, gc ends, we +1 readers, msg_store
- %% ets:deletes (and unlocks the dest)
- try Release(),
- Defer()
- catch error:badarg -> read(Server, Guid, CState)
- end
- end,
%% If a GC hasn't already started, it won't start now. Need to
%% check again to see if we've been locked in the meantime,
%% between lookup and update_counter (thus GC started before our
%% +1. In fact, it could have finished by now too).
case ets:lookup(FileSummaryEts, File) of
- [] -> %% GC has deleted our file
- ReleaseDefer();
+ [] -> %% GC has deleted our file, just go round again.
+ read(Server, Guid, CState);
[{#file_summary { locked = true }}] ->
- ReleaseDefer();
+ %% If we get a badarg here, then the GC has finished and
+ %% deleted our file. Try going around again. Otherwise,
+ %% just defer.
+
+ %% badarg scenario: we lookup, msg_store locks, gc starts,
+ %% gc ends, we +1 readers, msg_store ets:deletes (and
+ %% unlocks the dest)
+ try Release(),
+ Defer()
+ catch error:badarg -> read(Server, Guid, CState)
+ end;
_ ->
%% Ok, we're definitely safe to continue - a GC can't
%% start up now, and isn't running, so nothing will tell