diff options
| author | Matthias Radestock <matthias@lshift.net> | 2009-01-08 22:53:14 +0000 |
|---|---|---|
| committer | Matthias Radestock <matthias@lshift.net> | 2009-01-08 22:53:14 +0000 |
| commit | 6ce643b65a4858d58c9c6e70dda300d832688e77 (patch) | |
| tree | 07c09ddc9b6a0867ae0c92384a182d010ad20269 | |
| parent | 88a364ae3a9976e760be28637de7f039348ffad4 (diff) | |
| download | rabbitmq-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.erl | 14 |
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 |
