summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@lshift.net>2009-01-08 22:53:14 +0000
committerMatthias Radestock <matthias@lshift.net>2009-01-08 22:53:14 +0000
commit6ce643b65a4858d58c9c6e70dda300d832688e77 (patch)
tree07c09ddc9b6a0867ae0c92384a182d010ad20269
parent88a364ae3a9976e760be28637de7f039348ffad4 (diff)
downloadrabbitmq-server-git-6ce643b65a4858d58c9c6e70dda300d832688e77.tar.gz
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.
-rw-r--r--src/rabbit_limiter.erl14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/rabbit_limiter.erl b/src/rabbit_limiter.erl
index 3776edd0b5..e1d92f7211 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