summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@rabbitmq.com>2013-02-25 10:48:04 +0000
committerMatthias Radestock <matthias@rabbitmq.com>2013-02-25 10:48:04 +0000
commit4bb2c550bb6220c16738973586f669b11bf1dd2f (patch)
tree6b5717480db3834b54bcb598c2e20645b3e78d95
parent54529e84ae3d00fa24a2040fe9a1e342d3be5bba (diff)
downloadrabbitmq-server-bug25465.tar.gz
ignore early enotconn, and report early socket errors more nicelybug25465
-rw-r--r--src/rabbit_reader.erl25
1 files changed, 15 insertions, 10 deletions
diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl
index 0b5155da..d0d8e8c1 100644
--- a/src/rabbit_reader.erl
+++ b/src/rabbit_reader.erl
@@ -177,32 +177,37 @@ server_capabilities(_) ->
log(Level, Fmt, Args) -> rabbit_log:log(connection, Level, Fmt, Args).
+socket_error(Reason) ->
+ log(error, "error on AMQP connection ~p: ~p (~s)~n",
+ [self(), Reason, rabbit_misc:format_inet_error(Reason)]).
+
inet_op(F) -> rabbit_misc:throw_on_error(inet_error, F).
socket_op(Sock, Fun) ->
case Fun(Sock) of
{ok, Res} -> Res;
- {error, Reason} -> log(error, "error on AMQP connection ~p: ~p~n",
- [self(), Reason]),
+ {error, Reason} -> socket_error(Reason),
%% NB: this is tcp socket, even in case of ssl
rabbit_net:fast_close(Sock),
exit(normal)
end.
-name(Sock) ->
- socket_op(Sock, fun (S) -> rabbit_net:connection_string(S, inbound) end).
-
-socket_ends(Sock) ->
- socket_op(Sock, fun (S) -> rabbit_net:socket_ends(S, inbound) end).
-
start_connection(Parent, ChannelSupSupPid, Collector, StartHeartbeatFun, Deb,
Sock, SockTransform) ->
process_flag(trap_exit, true),
- Name = name(Sock),
+ Name = case rabbit_net:connection_string(Sock, inbound) of
+ {ok, Str} -> Str;
+ {error, enotconn} -> rabbit_net:fast_close(Sock),
+ exit(normal);
+ {error, Reason} -> socket_error(Reason),
+ rabbit_net:fast_close(Sock),
+ exit(normal)
+ end,
log(info, "accepting AMQP connection ~p (~s)~n", [self(), Name]),
ClientSock = socket_op(Sock, SockTransform),
erlang:send_after(?HANDSHAKE_TIMEOUT * 1000, self(), handshake_timeout),
- {PeerHost, PeerPort, Host, Port} = socket_ends(Sock),
+ {PeerHost, PeerPort, Host, Port} =
+ socket_op(Sock, fun (S) -> rabbit_net:socket_ends(S, inbound) end),
State = #v1{parent = Parent,
sock = ClientSock,
name = list_to_binary(Name),