]> granicus.if.org Git - ejabberd/commitdiff
Fix closing of outbound S2S connections
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Sat, 15 Apr 2017 08:15:50 +0000 (11:15 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Sat, 15 Apr 2017 08:15:50 +0000 (11:15 +0300)
src/mod_stream_mgmt.erl
src/xmpp_stream_in.erl
src/xmpp_stream_out.erl

index 97875fa813c25bd90e9f208df4c1d669b56948ec..0f64a47ccbecc73d53b6d986ade14cc7be0354b0 100644 (file)
@@ -233,7 +233,8 @@ c2s_handle_info(#{mgmt_ack_timer := TRef, jid := JID, mod := Mod} = State,
                {timeout, TRef, ack_timeout}) ->
     ?DEBUG("Timed out waiting for stream management acknowledgement of ~s",
           [jid:encode(JID)]),
-    {stop, Mod:close(State, ack_timeout)};
+    State1 = Mod:close(State),
+    {stop, transition_to_pending(State1)};
 c2s_handle_info(#{mgmt_state := pending, jid := JID, mod := Mod} = State,
                {timeout, _, pending_timeout}) ->
     ?DEBUG("Timed out waiting for resumption of stream for ~s",
index 073ae3d1fe3a424d592541f866873f65bd1ed97f..253adbf95bb285b90ce4eb23bdc4cda344c05d13 100644 (file)
@@ -151,23 +151,17 @@ send(_, _) ->
 
 -spec close(pid()) -> ok;
           (state()) -> state().
-close(Ref) ->
-    close(Ref, closed).
-
--spec close(pid(), atom()) -> ok;
-          (state(), atom()) -> state().
-close(Pid, Reason) when is_pid(Pid) ->
-    cast(Pid, {close, Reason});
-close(#{owner := Owner} = State, Reason) when Owner == self() ->
-    case is_disconnected(State) of
-       true -> State;
-       false ->
-           _IgnoreState = close_socket(State),
-           process_stream_end({socket, Reason}, State)
-    end;
-close(_, _) ->
+close(Pid) when is_pid(Pid) ->
+    close(Pid, closed);
+close(#{owner := Owner} = State) when Owner == self() ->
+    close_socket(State);
+close(_) ->
     erlang:error(badarg).
 
+-spec close(pid(), atom()) -> ok.
+close(Pid, Reason) ->
+    cast(Pid, {close, Reason}).
+
 -spec establish(state()) -> state().
 establish(State) ->
     process_stream_established(State).
@@ -275,7 +269,12 @@ handle_cast({send, Pkt}, State) ->
 handle_cast(stop, State) ->
     {stop, normal, State};
 handle_cast({close, Reason}, State) ->
-    noreply(close(State, Reason));
+    State1 = close_socket(State),
+    noreply(
+      case is_disconnected(State) of
+         true -> State1;
+         false -> process_stream_end({socket, Reason}, State)
+      end);
 handle_cast(Cast, #{mod := Mod} = State) ->
     noreply(try Mod:handle_cast(Cast, State)
              catch _:undef -> State
index c8a2fba1e39d5836628e3061ee52ba398104f367..af5c67c6608bdb7f8d4f62842a8f604837dc071c 100644 (file)
@@ -161,23 +161,17 @@ send(_, _) ->
 
 -spec close(pid()) -> ok;
           (state()) -> state().
-close(Ref) ->
-    close(Ref, closed).
-
--spec close(pid(), atom()) -> ok;
-          (state(), atom()) -> state().
-close(Pid, Reason) when is_pid(Pid) ->
-    cast(Pid, {close, Reason});
-close(#{owner := Owner} = State, Reason) when Owner == self() ->
-    case is_disconnected(State) of
-       true -> State;
-       false ->
-           _IgnoreState = close_socket(State),
-           process_stream_end({socket, Reason}, State)
-    end;
-close(_, _) ->
+close(Pid) when is_pid(Pid) ->
+    close(Pid, closed);
+close(#{owner := Owner} = State) when Owner == self() ->
+    close_socket(State);
+close(_) ->
     erlang:error(badarg).
 
+-spec close(pid(), atom()) -> ok.
+close(Pid, Reason) ->
+    cast(Pid, {close, Reason}).
+
 -spec establish(state()) -> state().
 establish(State) ->
     process_stream_established(State).
@@ -306,7 +300,12 @@ handle_cast({send, Pkt}, State) ->
 handle_cast(stop, State) ->
     {stop, normal, State};
 handle_cast({close, Reason}, State) ->
-    noreply(close(State, Reason));
+    State1 = close_socket(State),
+    noreply(
+      case is_disconnected(State) of
+         true -> State1;
+         false -> process_stream_end({socket, Reason}, State)
+      end);
 handle_cast(Cast, #{mod := Mod} = State) ->
     noreply(try Mod:handle_cast(Cast, State)
            catch _:undef -> State