summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@lshift.net>2009-09-30 13:04:56 +0100
committerMatthias Radestock <matthias@lshift.net>2009-09-30 13:04:56 +0100
commit2ca73466d4c0c7b8d98976a01cddc414f31a3198 (patch)
treeee7917edaf343a93c5c7728ed0ea00cf493f84f7
parent4aaea60e8804fd1be95ff915f6b3a4c1e2af158e (diff)
downloadrabbitmq-server-2ca73466d4c0c7b8d98976a01cddc414f31a3198.tar.gz
handle errors during connection establishment more gracefully
-rw-r--r--src/rabbit_networking.erl30
-rw-r--r--src/tcp_acceptor.erl27
2 files changed, 37 insertions, 20 deletions
diff --git a/src/rabbit_networking.erl b/src/rabbit_networking.erl
index 4bbdb65e..1bc17a32 100644
--- a/src/rabbit_networking.erl
+++ b/src/rabbit_networking.erl
@@ -167,19 +167,27 @@ start_client(Sock) ->
Child.
start_ssl_client(SslOpts, Sock) ->
- {ok, {PeerAddress, PeerPort}} = rabbit_net:peername(Sock),
- PeerIp = inet_parse:ntoa(PeerAddress),
-
- case ssl:ssl_accept(Sock, SslOpts) of
- {ok, SslSock} ->
- rabbit_log:info("upgraded TCP connection from ~s:~p to SSL~n",
- [PeerIp, PeerPort]),
- RabbitSslSock = #ssl_socket{tcp = Sock, ssl = SslSock},
- start_client(RabbitSslSock);
+ case rabbit_net:peername(Sock) of
+ {ok, {PeerAddress, PeerPort}} ->
+ PeerIp = inet_parse:ntoa(PeerAddress),
+ case ssl:ssl_accept(Sock, SslOpts) of
+ {ok, SslSock} ->
+ rabbit_log:info("upgraded TCP connection "
+ "from ~s:~p to SSL~n",
+ [PeerIp, PeerPort]),
+ RabbitSslSock = #ssl_socket{tcp = Sock, ssl = SslSock},
+ start_client(RabbitSslSock);
+ {error, Reason} ->
+ gen_tcp:close(Sock),
+ rabbit_log:error("failed to upgrade TCP connection "
+ "from ~s:~p to SSL: ~n~p~n",
+ [PeerIp, PeerPort, Reason]),
+ {error, Reason}
+ end;
{error, Reason} ->
gen_tcp:close(Sock),
- rabbit_log:error("failed to upgrade TCP connection from ~s:~p "
- "to SSL: ~n~p~n", [PeerIp, PeerPort, Reason]),
+ rabbit_log:error("failed to upgrade TCP connection to SSL: ~p~n",
+ [Reason]),
{error, Reason}
end.
diff --git a/src/tcp_acceptor.erl b/src/tcp_acceptor.erl
index aa8b8ad5..bc742561 100644
--- a/src/tcp_acceptor.erl
+++ b/src/tcp_acceptor.erl
@@ -67,15 +67,20 @@ handle_info({inet_async, LSock, Ref, {ok, Sock}},
{ok, Mod} = inet_db:lookup_socket(LSock),
inet_db:register_socket(Sock, Mod),
- %% report
- {ok, {Address, Port}} = inet:sockname(LSock),
- {ok, {PeerAddress, PeerPort}} = inet:peername(Sock),
- error_logger:info_msg("accepted TCP connection on ~s:~p from ~s:~p~n",
- [inet_parse:ntoa(Address), Port,
- inet_parse:ntoa(PeerAddress), PeerPort]),
-
- %% handle
- apply(M, F, A ++ [Sock]),
+ try
+ %% report
+ {Address, Port} = inet_op(fun () -> inet:sockname(LSock) end),
+ {PeerAddress, PeerPort} = inet_op(fun () -> inet:peername(Sock) end),
+ error_logger:info_msg("accepted TCP connection on ~s:~p from ~s:~p~n",
+ [inet_parse:ntoa(Address), Port,
+ inet_parse:ntoa(PeerAddress), PeerPort]),
+ %% handle
+ apply(M, F, A ++ [Sock])
+ catch {inet_error, Reason} ->
+ gen_tcp:close(Sock),
+ error_logger:error_msg("unable to accept TCP connection: ~p~n",
+ [Reason])
+ end,
%% accept more
case prim_inet:async_accept(LSock, -1) of
@@ -95,3 +100,7 @@ terminate(_Reason, _State) ->
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
+
+%%--------------------------------------------------------------------
+
+inet_op(F) -> rabbit_misc:throw_on_error(inet_error, F).