summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2010-09-17 12:40:26 +0100
committerSimon MacMullen <simon@rabbitmq.com>2010-09-17 12:40:26 +0100
commited6694bc07092f46e15d54ed4b362eff203d45b1 (patch)
tree2947999c8a3e37dd57d5b12f0908172382282cd7
parent9df14122325caa6acf00e30de2e2062089a5dff1 (diff)
downloadrabbitmq-server-ed6694bc07092f46e15d54ed4b362eff203d45b1.tar.gz
Ignore socket errors when not running.
-rw-r--r--src/rabbit_reader.erl27
1 files changed, 15 insertions, 12 deletions
diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl
index 252f81a3..1a77de0a 100644
--- a/src/rabbit_reader.erl
+++ b/src/rabbit_reader.erl
@@ -808,18 +808,14 @@ infos(Items, State) -> [{Item, i(Item, State)} || Item <- Items].
i(pid, #v1{}) ->
self();
-i(address, #v1{sock = Sock}) ->
- {ok, {A, _}} = rabbit_net:sockname(Sock),
- A;
-i(port, #v1{sock = Sock}) ->
- {ok, {_, P}} = rabbit_net:sockname(Sock),
- P;
-i(peer_address, #v1{sock = Sock}) ->
- {ok, {A, _}} = rabbit_net:peername(Sock),
- A;
-i(peer_port, #v1{sock = Sock}) ->
- {ok, {_, P}} = rabbit_net:peername(Sock),
- P;
+i(address, State = #v1{sock = Sock}) ->
+ socket_info(1, fun rabbit_net:sockname/1, State);
+i(port, State = #v1{sock = Sock}) ->
+ socket_info(2, fun rabbit_net:sockname/1, State);
+i(peer_address, State = #v1{sock = Sock}) ->
+ socket_info(1, fun rabbit_net:peername/1, State);
+i(peer_port, State = #v1{sock = Sock}) ->
+ socket_info(2, fun rabbit_net:peername/1, State);
i(SockStat, #v1{sock = Sock}) when SockStat =:= recv_oct;
SockStat =:= recv_cnt;
SockStat =:= send_oct;
@@ -854,6 +850,13 @@ i(client_properties, #v1{connection = #connection{
i(Item, #v1{}) ->
throw({bad_argument, Item}).
+socket_info(I, Fun, State = #v1 {sock = Sock}) ->
+ case {Fun(Sock), ?IS_RUNNING(State)} of
+ {{ok, T}, _} -> element(I, T);
+ {{error, E}, true} -> throw({cannot_get_socket_stats, E});
+ {{error, E}, false} -> E
+ end.
+
%%--------------------------------------------------------------------------
send_to_new_channel(Channel, AnalyzedFrame, State) ->