diff options
author | Matthias Radestock <matthias@rabbitmq.com> | 2013-02-25 10:48:04 +0000 |
---|---|---|
committer | Matthias Radestock <matthias@rabbitmq.com> | 2013-02-25 10:48:04 +0000 |
commit | 4bb2c550bb6220c16738973586f669b11bf1dd2f (patch) | |
tree | 6b5717480db3834b54bcb598c2e20645b3e78d95 | |
parent | 54529e84ae3d00fa24a2040fe9a1e342d3be5bba (diff) | |
download | rabbitmq-server-bug25465.tar.gz |
ignore early enotconn, and report early socket errors more nicelybug25465
-rw-r--r-- | src/rabbit_reader.erl | 25 |
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), |