summaryrefslogtreecommitdiff
path: root/src/rabbit_writer.erl
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@rabbitmq.com>2012-11-02 09:13:44 +0000
committerMatthias Radestock <matthias@rabbitmq.com>2012-11-02 09:13:44 +0000
commit43d796ee6ee1f162f0979b87c9b4ad75f123f1f1 (patch)
treef12247bd25f75a0946aa12beb106bfd65967bea6 /src/rabbit_writer.erl
parent96998d05cb0de99c46d60ea8c1388b6ec66ffa95 (diff)
downloadrabbitmq-server-43d796ee6ee1f162f0979b87c9b4ad75f123f1f1.tar.gz
only trigger stats emission from writers in the serverbug23225
(and not the Erlang client) The server (and *only* the server) starts channels with rabbit_channel_sup:start_link({tcp, ...}). Writers are created as part of that. We pass an extra argument to rabbit_writer:start_link in this case, indicating that the reader wants be told by the writer to emit stats. Internally, the writer handles the stats/no_stats distinction by initialising the stats timer differently. We introduce a new function to create a disabled stats timer, thus taking advantage of all the existing logic in rabbit_event that suppresses timer/stats operations when stats are disabled. This approach requires inclusion of rabbit_event in rabbit_common.
Diffstat (limited to 'src/rabbit_writer.erl')
-rw-r--r--src/rabbit_writer.erl43
1 files changed, 31 insertions, 12 deletions
diff --git a/src/rabbit_writer.erl b/src/rabbit_writer.erl
index c23f46f9..a7ea3d99 100644
--- a/src/rabbit_writer.erl
+++ b/src/rabbit_writer.erl
@@ -18,7 +18,7 @@
-include("rabbit.hrl").
-include("rabbit_framing.hrl").
--export([start/5, start_link/5]).
+-export([start/5, start_link/5, start/6, start_link/6]).
-export([send_command/2, send_command/3,
send_command_sync/2, send_command_sync/3,
send_command_and_notify/4, send_command_and_notify/5]).
@@ -44,6 +44,14 @@
(rabbit_net:socket(), rabbit_channel:channel_number(),
non_neg_integer(), rabbit_types:protocol(), pid())
-> rabbit_types:ok(pid())).
+-spec(start/6 ::
+ (rabbit_net:socket(), rabbit_channel:channel_number(),
+ non_neg_integer(), rabbit_types:protocol(), pid(), boolean())
+ -> rabbit_types:ok(pid())).
+-spec(start_link/6 ::
+ (rabbit_net:socket(), rabbit_channel:channel_number(),
+ non_neg_integer(), rabbit_types:protocol(), pid(), boolean())
+ -> rabbit_types:ok(pid())).
-spec(send_command/2 ::
(pid(), rabbit_framing:amqp_method_record()) -> 'ok').
-spec(send_command/3 ::
@@ -76,21 +84,32 @@
%%---------------------------------------------------------------------------
start(Sock, Channel, FrameMax, Protocol, ReaderPid) ->
- State = initial_state(Sock, Channel, FrameMax, Protocol, ReaderPid),
- {ok, proc_lib:spawn(?MODULE, mainloop, [State])}.
+ start(Sock, Channel, FrameMax, Protocol, ReaderPid, false).
start_link(Sock, Channel, FrameMax, Protocol, ReaderPid) ->
- State = initial_state(Sock, Channel, FrameMax, Protocol, ReaderPid),
+ start_link(Sock, Channel, FrameMax, Protocol, ReaderPid, false).
+
+start(Sock, Channel, FrameMax, Protocol, ReaderPid, ReaderWantsStats) ->
+ State = initial_state(Sock, Channel, FrameMax, Protocol, ReaderPid,
+ ReaderWantsStats),
+ {ok, proc_lib:spawn(?MODULE, mainloop, [State])}.
+
+start_link(Sock, Channel, FrameMax, Protocol, ReaderPid, ReaderWantsStats) ->
+ State = initial_state(Sock, Channel, FrameMax, Protocol, ReaderPid,
+ ReaderWantsStats),
{ok, proc_lib:spawn_link(?MODULE, mainloop, [State])}.
-initial_state(Sock, Channel, FrameMax, Protocol, ReaderPid) ->
- rabbit_event:init_stats_timer(#wstate{sock = Sock,
- channel = Channel,
- frame_max = FrameMax,
- protocol = Protocol,
- reader = ReaderPid,
- pending = []},
- #wstate.stats_timer).
+initial_state(Sock, Channel, FrameMax, Protocol, ReaderPid, ReaderWantsStats) ->
+ (case ReaderWantsStats of
+ true -> fun rabbit_event:init_stats_timer/2;
+ false -> fun rabbit_event:init_disabled_stats_timer/2
+ end)(#wstate{sock = Sock,
+ channel = Channel,
+ frame_max = FrameMax,
+ protocol = Protocol,
+ reader = ReaderPid,
+ pending = []},
+ #wstate.stats_timer).
mainloop(State) ->
try