summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@lshift.net>2009-08-10 15:43:35 +0100
committerMatthew Sackman <matthew@lshift.net>2009-08-10 15:43:35 +0100
commite92691cee2acdb0a6ce1072457998a5e7a56011b (patch)
treecc826722c45609fc2703124e8e6c3975c107f456
parent4d019b5fc64e7643b76d691fdc084633a5bd4b58 (diff)
downloadrabbitmq-server-git-e92691cee2acdb0a6ce1072457998a5e7a56011b.tar.gz
Channel now catches the exit of the writer and signals the reader explicitly. It then exits normally, thus avoiding the pointless and expensive formatting of its error message
-rw-r--r--src/rabbit_channel.erl4
-rw-r--r--src/rabbit_reader.erl2
2 files changed, 5 insertions, 1 deletions
diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl
index 58b9423460..c30024a6eb 100644
--- a/src/rabbit_channel.erl
+++ b/src/rabbit_channel.erl
@@ -157,6 +157,10 @@ handle_cast({conserve_memory, Conserve}, State) ->
State#ch.writer_pid, #'channel.flow'{active = not(Conserve)}),
noreply(State).
+handle_info({'EXIT', WriterPid, Reason = {writer, send_failed, _Error}},
+ State = #ch{writer_pid = WriterPid}) ->
+ State#ch.reader_pid ! {channel_unexpected_exit, Reason},
+ {stop, normal, State};
handle_info({'EXIT', _Pid, Reason}, State) ->
{stop, Reason, State};
diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl
index 426b99eba1..91732e0da7 100644
--- a/src/rabbit_reader.erl
+++ b/src/rabbit_reader.erl
@@ -286,7 +286,7 @@ mainloop(Parent, Deb, State = #v1{sock= Sock, recv_ref = Ref}) ->
%% since this termination is initiated by our parent it is
%% probably more important to exit quickly.
exit(Reason);
- {'EXIT', _Pid, E = {writer, send_failed, _Error}} ->
+ {channel_unexpected_exit, E = {writer, send_failed, _Error}} ->
throw(E);
{channel_exit, Channel, Reason} ->
mainloop(Parent, Deb, handle_channel_exit(Channel, Reason, State));