diff options
author | Simon MacMullen <simon@rabbitmq.com> | 2012-03-07 17:46:51 +0000 |
---|---|---|
committer | Simon MacMullen <simon@rabbitmq.com> | 2012-03-07 17:46:51 +0000 |
commit | c3a522c467f8884c772ca2a404036402a033e85e (patch) | |
tree | c283d0916a4ef275a75286ade148c48695586af8 | |
parent | 9db3cf4c401e1e5531c7d09ea42bd5456e96c806 (diff) | |
parent | 80ff65d306f27ce45f50b67397a4d06d3d8fcf61 (diff) | |
download | rabbitmq-server-c3a522c467f8884c772ca2a404036402a033e85e.tar.gz |
Merge bug24779
-rw-r--r-- | src/rabbit_net.erl | 7 | ||||
-rw-r--r-- | src/rabbit_reader.erl | 13 | ||||
-rw-r--r-- | src/tcp_acceptor.erl | 8 |
3 files changed, 15 insertions, 13 deletions
diff --git a/src/rabbit_net.erl b/src/rabbit_net.erl index 02889b93..e6a05335 100644 --- a/src/rabbit_net.erl +++ b/src/rabbit_net.erl @@ -19,7 +19,8 @@ -export([is_ssl/1, ssl_info/1, controlling_process/2, getstat/2, recv/1, async_recv/3, port_command/2, setopts/2, send/2, close/1, - sockname/1, peername/1, peercert/1, connection_string/2]). + maybe_fast_close/1, sockname/1, peername/1, peercert/1, + connection_string/2]). %%--------------------------------------------------------------------------- @@ -53,6 +54,7 @@ binary()}]) -> ok_or_any_error()). -spec(send/2 :: (socket(), binary() | iolist()) -> ok_or_any_error()). -spec(close/1 :: (socket()) -> ok_or_any_error()). +-spec(maybe_fast_close/1 :: (socket()) -> ok_or_any_error()). -spec(sockname/1 :: (socket()) -> ok_val_or_error({inet:ip_address(), rabbit_networking:ip_port()})). @@ -135,6 +137,9 @@ send(Sock, Data) when is_port(Sock) -> gen_tcp:send(Sock, Data). close(Sock) when ?IS_SSL(Sock) -> ssl:close(Sock#ssl_socket.ssl); close(Sock) when is_port(Sock) -> gen_tcp:close(Sock). +maybe_fast_close(Sock) when ?IS_SSL(Sock) -> ok; +maybe_fast_close(Sock) when is_port(Sock) -> erlang:port_close(Sock), ok. + sockname(Sock) when ?IS_SSL(Sock) -> ssl:sockname(Sock#ssl_socket.ssl); sockname(Sock) when is_port(Sock) -> inet:sockname(Sock). diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index add13043..47e796dc 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -233,12 +233,15 @@ start_connection(Parent, ChannelSupSupPid, Collector, StartHeartbeatFun, Deb, end, "closing AMQP connection ~p (~s):~n~p~n", [self(), ConnStr, Ex]) after - %% We don't close the socket explicitly. The reader is the - %% controlling process and hence its termination will close - %% the socket. Furthermore, gen_tcp:close/1 waits for pending - %% output to be sent, which results in unnecessary delays. + %% The reader is the controlling process and hence its + %% termination will close the socket. Furthermore, + %% gen_tcp:close/1 waits for pending output to be sent, which + %% results in unnecessary delays. However, to keep the + %% file_handle_cache accounting as accurate as possible it + %% would be good to close the socket immediately if we + %% can. But we can only do this for non-ssl sockets. %% - %% gen_tcp:close(ClientSock), + rabbit_net:maybe_fast_close(ClientSock), rabbit_event:notify(connection_closed, [{pid, self()}]) end, done. diff --git a/src/tcp_acceptor.erl b/src/tcp_acceptor.erl index 43a6bc99..344196d7 100644 --- a/src/tcp_acceptor.erl +++ b/src/tcp_acceptor.erl @@ -69,13 +69,7 @@ handle_info({inet_async, LSock, Ref, {error, closed}}, handle_info({inet_async, LSock, Ref, {error, Reason}}, State=#state{sock=LSock, ref=Ref}) -> - {AddressS, Port} = case inet:sockname(LSock) of - {ok, {A, P}} -> {rabbit_misc:ntoab(A), P}; - {error, _} -> {"unknown", unknown} - end, - error_logger:error_msg("failed to accept TCP connection on ~s:~p: ~p~n", - [AddressS, Port, Reason]), - accept(State); + {stop, {accept_failed, Reason}, State}; handle_info(_Info, State) -> {noreply, State}. |