summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@rabbitmq.com>2013-02-26 15:31:01 +0000
committerMatthias Radestock <matthias@rabbitmq.com>2013-02-26 15:31:01 +0000
commit7c99d0f8b3d5ca07e19ab5736b26b5b8892e151e (patch)
tree6f130848898c09938774fa888dc6c420991eae4f
parentd1d025d340adba0b85982c2b1dd451adecc50b84 (diff)
downloadrabbitmq-server-bug25467.tar.gz
move socket buffer tuning into tcp_acceptorbug25467
-rw-r--r--src/rabbit_net.erl10
-rw-r--r--src/rabbit_reader.erl1
-rw-r--r--src/tcp_acceptor.erl22
3 files changed, 21 insertions, 12 deletions
diff --git a/src/rabbit_net.erl b/src/rabbit_net.erl
index b8b03f56..b53c16bf 100644
--- a/src/rabbit_net.erl
+++ b/src/rabbit_net.erl
@@ -20,7 +20,7 @@
-export([is_ssl/1, ssl_info/1, controlling_process/2, getstat/2,
recv/1, async_recv/3, port_command/2, getopts/2, setopts/2, send/2,
close/1, fast_close/1, sockname/1, peername/1, peercert/1,
- tune_buffer_size/1, connection_string/2, socket_ends/2]).
+ connection_string/2, socket_ends/2]).
%%---------------------------------------------------------------------------
@@ -69,7 +69,6 @@
-spec(peercert/1 ::
(socket())
-> 'nossl' | ok_val_or_error(rabbit_ssl:certificate())).
--spec(tune_buffer_size/1 :: (socket()) -> ok_or_any_error()).
-spec(connection_string/2 ::
(socket(), 'inbound' | 'outbound') -> ok_val_or_error(string())).
-spec(socket_ends/2 ::
@@ -189,13 +188,6 @@ peername(Sock) when is_port(Sock) -> inet:peername(Sock).
peercert(Sock) when ?IS_SSL(Sock) -> ssl:peercert(Sock#ssl_socket.ssl);
peercert(Sock) when is_port(Sock) -> nossl.
-tune_buffer_size(Sock) ->
- case getopts(Sock, [sndbuf, recbuf, buffer]) of
- {ok, BufSizes} -> BufSz = lists:max([Sz || {_Opt, Sz} <- BufSizes]),
- setopts(Sock, [{buffer, BufSz}]);
- Err -> Err
- end.
-
connection_string(Sock, Direction) ->
case socket_ends(Sock, Direction) of
{ok, {FromAddress, FromPort, ToAddress, ToPort}} ->
diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl
index 2bdef92d..6294451b 100644
--- a/src/rabbit_reader.erl
+++ b/src/rabbit_reader.erl
@@ -250,7 +250,6 @@ start_connection(Parent, ConnSupPid, Collector, StartHeartbeatFun, Deb,
last_blocked_by = none,
last_blocked_at = never}},
try
- ok = inet_op(fun () -> rabbit_net:tune_buffer_size(ClientSock) end),
run({?MODULE, recvloop,
[Deb, switch_callback(rabbit_event:init_stats_timer(
State, #v1.stats_timer),
diff --git a/src/tcp_acceptor.erl b/src/tcp_acceptor.erl
index c76681c2..2725be31 100644
--- a/src/tcp_acceptor.erl
+++ b/src/tcp_acceptor.erl
@@ -55,8 +55,19 @@ handle_info({inet_async, LSock, Ref, {ok, Sock}},
inet_db:register_socket(Sock, Mod),
%% handle
- file_handle_cache:transfer(apply(M, F, A ++ [Sock])),
- ok = file_handle_cache:obtain(),
+ case tune_buffer_size(Sock) of
+ ok -> file_handle_cache:transfer(
+ apply(M, F, A ++ [Sock])),
+ ok = file_handle_cache:obtain();
+ {error, enotconn} -> catch port_close(Sock);
+ {error, Err} -> {ok, {IPAddress, Port}} = inet:sockname(LSock),
+ error_logger:error_msg(
+ "failed to tune buffer size of "
+ "connection accepted on ~s:~p - ~p (~s)~n",
+ [rabbit_misc:ntoab(IPAddress), Port,
+ Err, rabbit_misc:format_inet_error(Err)]),
+ catch port_close(Sock)
+ end,
%% accept more
accept(State);
@@ -85,3 +96,10 @@ accept(State = #state{sock=LSock}) ->
{ok, Ref} -> {noreply, State#state{ref=Ref}};
Error -> {stop, {cannot_accept, Error}, State}
end.
+
+tune_buffer_size(Sock) ->
+ case inet:getopts(Sock, [sndbuf, recbuf, buffer]) of
+ {ok, BufSizes} -> BufSz = lists:max([Sz || {_Opt, Sz} <- BufSizes]),
+ inet:setopts(Sock, [{buffer, BufSz}]);
+ Error -> Error
+ end.