diff options
author | Matthias Radestock <matthias@rabbitmq.com> | 2010-07-18 17:45:54 +0100 |
---|---|---|
committer | Matthias Radestock <matthias@rabbitmq.com> | 2010-07-18 17:45:54 +0100 |
commit | 53f65ded1fc6d9ba3bf7ccc37b787eac59f3c01c (patch) | |
tree | 1f62db10a02d7edf7bfaa33d6d57d801854b366a | |
parent | c07d7710b6d716fa41306994fc266f11bc931b86 (diff) | |
download | rabbitmq-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.erl | 10 | ||||
-rw-r--r-- | src/rabbit_tests.erl | 4 | ||||
-rw-r--r-- | src/rabbit_variable_queue.erl | 8 |
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 }). |