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 | 16a111b8fd470357de1edd61c84febe0c34c2f26 (patch) | |
| tree | 1f62db10a02d7edf7bfaa33d6d57d801854b366a | |
| parent | c094929eb41935924f01581d818850ca065ee92c (diff) | |
| download | rabbitmq-server-git-16a111b8fd470357de1edd61c84febe0c34c2f26.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 7dea2f94af..631005711b 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 630483da74..ec0387c639 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 35a6ff7825..b3ba3f17bf 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 }). |
