summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@rabbitmq.com>2010-07-18 17:45:54 +0100
committerMatthias Radestock <matthias@rabbitmq.com>2010-07-18 17:45:54 +0100
commit53f65ded1fc6d9ba3bf7ccc37b787eac59f3c01c (patch)
tree1f62db10a02d7edf7bfaa33d6d57d801854b366a
parentc07d7710b6d716fa41306994fc266f11bc931b86 (diff)
downloadrabbitmq-server-53f65ded1fc6d9ba3bf7ccc37b787eac59f3c01c.tar.gz
tweak msg_store API to make it safer
...by not allowing clients to be deleted w/o terminating them too
-rw-r--r--src/rabbit_msg_store.erl10
-rw-r--r--src/rabbit_tests.erl4
-rw-r--r--src/rabbit_variable_queue.erl8
3 files changed, 12 insertions, 10 deletions
diff --git a/src/rabbit_msg_store.erl b/src/rabbit_msg_store.erl
index 7dea2f94..63100571 100644
--- a/src/rabbit_msg_store.erl
+++ b/src/rabbit_msg_store.erl
@@ -34,8 +34,8 @@
-behaviour(gen_server2).
-export([start_link/4, write/4, read/3, contains/2, remove/2, release/2,
- sync/3, client_init/2, client_terminate/1, delete_client/2,
- successfully_recovered_state/1]).
+ sync/3, client_init/2, client_terminate/1,
+ client_delete_and_terminate/3, successfully_recovered_state/1]).
-export([sync/1, gc_done/4, set_maximum_since_use/2, gc/3]). %% internal
@@ -138,7 +138,8 @@
-spec(set_maximum_since_use/2 :: (server(), non_neg_integer()) -> 'ok').
-spec(client_init/2 :: (server(), binary()) -> client_msstate()).
-spec(client_terminate/1 :: (client_msstate()) -> 'ok').
--spec(delete_client/2 :: (server(), binary()) -> 'ok').
+-spec(client_delete_and_terminate/3 ::
+ (client_msstate(), server(), binary()) -> 'ok').
-spec(successfully_recovered_state/1 :: (server()) -> boolean()).
-spec(gc/3 :: (non_neg_integer(), non_neg_integer(),
@@ -377,7 +378,8 @@ client_terminate(CState) ->
close_all_handles(CState),
ok.
-delete_client(Server, Ref) ->
+client_delete_and_terminate(CState, Server, Ref) ->
+ ok = client_terminate(CState),
ok = gen_server2:call(Server, {delete_client, Ref}, infinity).
successfully_recovered_state(Server) ->
diff --git a/src/rabbit_tests.erl b/src/rabbit_tests.erl
index 630483da..ec0387c6 100644
--- a/src/rabbit_tests.erl
+++ b/src/rabbit_tests.erl
@@ -1598,8 +1598,8 @@ queue_index_publish(SeqIds, Persistent, Qi) ->
Guid, MSCStateN),
{QiM, [{SeqId, Guid} | SeqIdsGuidsAcc], MSCStateM}
end, {Qi, [], rabbit_msg_store:client_init(MsgStore, Ref)}, SeqIds),
- ok = rabbit_msg_store:delete_client(MsgStore, Ref),
- ok = rabbit_msg_store:client_terminate(MSCStateEnd),
+ ok = rabbit_msg_store:client_delete_and_terminate(
+ MSCStateEnd, MsgStore, Ref),
{A, B}.
verify_read_with_published(_Delivered, _Persistent, [], _) ->
diff --git a/src/rabbit_variable_queue.erl b/src/rabbit_variable_queue.erl
index 35a6ff78..b3ba3f17 100644
--- a/src/rabbit_variable_queue.erl
+++ b/src/rabbit_variable_queue.erl
@@ -403,12 +403,12 @@ delete_and_terminate(State) ->
IndexState1 = rabbit_queue_index:delete_and_terminate(IndexState),
case MSCStateP of
undefined -> ok;
- _ -> rabbit_msg_store:delete_client(
- ?PERSISTENT_MSG_STORE, PRef),
+ _ -> rabbit_msg_store:client_delete_and_terminate(
+ MSCStateP, ?PERSISTENT_MSG_STORE, PRef),
rabbit_msg_store:client_terminate(MSCStateP)
end,
- rabbit_msg_store:delete_client(?TRANSIENT_MSG_STORE, TRef),
- rabbit_msg_store:client_terminate(MSCStateT),
+ rabbit_msg_store:client_delete_and_terminate(
+ MSCStateT, ?TRANSIENT_MSG_STORE, TRef),
a(State2 #vqstate { index_state = IndexState1,
msg_store_clients = undefined }).