Procházet zdrojové kódy

Merge pull request #12075 from keynslug/fix/EMQX-11474/function-clause

fix(channel): expect there's no session yet on disconnect
Andrew Mayorov před 2 roky
rodič
revize
6eba082992

+ 6 - 1
apps/emqx/src/emqx_channel.erl

@@ -1211,7 +1211,7 @@ handle_info(
 ) when
     ConnState =:= connected orelse ConnState =:= reauthenticating
 ->
-    {Intent, Session1} = emqx_session:disconnect(ClientInfo, ConnInfo, Session),
+    {Intent, Session1} = session_disconnect(ClientInfo, ConnInfo, Session),
     Channel1 = ensure_disconnected(Reason, maybe_publish_will_msg(Channel)),
     Channel2 = Channel1#channel{session = Session1},
     case maybe_shutdown(Reason, Intent, Channel2) of
@@ -2191,6 +2191,11 @@ ensure_disconnected(
     emqx_cm:mark_channel_disconnected(ChanPid),
     Channel#channel{conninfo = NConnInfo, conn_state = disconnected}.
 
+session_disconnect(ClientInfo, ConnInfo, Session) when Session /= undefined ->
+    emqx_session:disconnect(ClientInfo, ConnInfo, Session);
+session_disconnect(_ClientInfo, _ConnInfo, undefined) ->
+    {shutdown, undefined}.
+
 %%--------------------------------------------------------------------
 %% Maybe Publish will msg
 

+ 2 - 2
apps/emqx/src/emqx_session.erl

@@ -606,8 +606,8 @@ maybe_mock_impl_mod({Mock, _State}) when is_atom(Mock) ->
     Mock.
 -else.
 -spec maybe_mock_impl_mod(_Session) -> no_return().
-maybe_mock_impl_mod(_) ->
-    error(noimpl).
+maybe_mock_impl_mod(Session) ->
+    error(noimpl, [Session]).
 -endif.
 
 -spec choose_impl_mod(conninfo()) -> module().