From b53ab4e9ad895f1fe0830cd153482693a2b18af2 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 8 Jan 2009 22:53:14 +0000 Subject: replace gen_server:cast with gen_server2:cast in rabbit_limiter The limiter is co-located with channels but interacts with queues which may be on different nodes. It is therefore subject to the message reordering problem of cross-node gen_server:cast - see bug 19749. For consistency I replaced gen_server:call as well, though I left the gen_server:start_link alone in order to avoid the (admittedly small) penalty introduced by gen_server2's modified main loop. --- src/rabbit_limiter.erl | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/rabbit_limiter.erl b/src/rabbit_limiter.erl index 3776edd0..e1d92f72 100644 --- a/src/rabbit_limiter.erl +++ b/src/rabbit_limiter.erl @@ -31,7 +31,7 @@ -module(rabbit_limiter). --behaviour(gen_server). +-behaviour(gen_server2). -export([init/1, terminate/2, code_change/3, handle_call/3, handle_cast/2, handle_info/2]). @@ -70,12 +70,12 @@ start_link(ChPid) -> shutdown(undefined) -> ok; shutdown(LimiterPid) -> - gen_server:cast(LimiterPid, shutdown). + gen_server2:cast(LimiterPid, shutdown). limit(undefined, 0) -> ok; limit(LimiterPid, PrefetchCount) -> - gen_server:cast(LimiterPid, {limit, PrefetchCount}). + gen_server2:cast(LimiterPid, {limit, PrefetchCount}). %% Ask the limiter whether the queue can deliver a message without %% breaching a limit @@ -84,18 +84,18 @@ can_send(undefined, _QPid) -> can_send(LimiterPid, QPid) -> rabbit_misc:with_exit_handler( fun () -> true end, - fun () -> gen_server:call(LimiterPid, {can_send, QPid}) end). + fun () -> gen_server2:call(LimiterPid, {can_send, QPid}) end). %% Let the limiter know that the channel has received some acks from a %% consumer ack(undefined, _Count) -> ok; -ack(LimiterPid, Count) -> gen_server:cast(LimiterPid, {ack, Count}). +ack(LimiterPid, Count) -> gen_server2:cast(LimiterPid, {ack, Count}). register(undefined, _QPid) -> ok; -register(LimiterPid, QPid) -> gen_server:cast(LimiterPid, {register, QPid}). +register(LimiterPid, QPid) -> gen_server2:cast(LimiterPid, {register, QPid}). unregister(undefined, _QPid) -> ok; -unregister(LimiterPid, QPid) -> gen_server:cast(LimiterPid, {unregister, QPid}). +unregister(LimiterPid, QPid) -> gen_server2:cast(LimiterPid, {unregister, QPid}). %%---------------------------------------------------------------------------- %% gen_server callbacks -- cgit v1.2.1 From fbd08ac50a6418da6dc6ec04e048e9bcfd25378e Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 8 Jan 2009 22:57:02 +0000 Subject: oops, meant to advertise this as an ordinary gen_server which it still is, since I left the gen_server:start_link in place. --- src/rabbit_limiter.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rabbit_limiter.erl b/src/rabbit_limiter.erl index e1d92f72..7ecdb6fb 100644 --- a/src/rabbit_limiter.erl +++ b/src/rabbit_limiter.erl @@ -31,7 +31,7 @@ -module(rabbit_limiter). --behaviour(gen_server2). +-behaviour(gen_server). -export([init/1, terminate/2, code_change/3, handle_call/3, handle_cast/2, handle_info/2]). -- cgit v1.2.1