summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_net.erl7
-rw-r--r--src/rabbit_reader.erl13
-rw-r--r--src/tcp_acceptor.erl8
3 files changed, 15 insertions, 13 deletions
diff --git a/src/rabbit_net.erl b/src/rabbit_net.erl
index 02889b93a3..e6a0533547 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 add1304316..47e796dcb7 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 43a6bc994b..344196d70d 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}.