diff options
| author | Matthew Sackman <matthew@lshift.net> | 2009-08-10 15:43:35 +0100 |
|---|---|---|
| committer | Matthew Sackman <matthew@lshift.net> | 2009-08-10 15:43:35 +0100 |
| commit | e92691cee2acdb0a6ce1072457998a5e7a56011b (patch) | |
| tree | cc826722c45609fc2703124e8e6c3975c107f456 /src | |
| parent | 4d019b5fc64e7643b76d691fdc084633a5bd4b58 (diff) | |
| download | rabbitmq-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
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_channel.erl | 4 | ||||
| -rw-r--r-- | src/rabbit_reader.erl | 2 |
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)); |
