Merge pull request #12769 from SergeTupchiy/EMQX-12058-handle-client-shutdown-errors

fix:(emqx_mgmt): handle client shutdown errors in call_client
This commit is contained in:
SergeTupchiy 2024-03-22 17:43:57 +02:00 committed by GitHub
commit 70378052dd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 19 additions and 2 deletions

View File

@ -514,7 +514,7 @@ do_call_client(ClientId, Req) ->
Pid = lists:last(Pids), Pid = lists:last(Pids),
case emqx_cm:get_chan_info(ClientId, Pid) of case emqx_cm:get_chan_info(ClientId, Pid) of
#{conninfo := #{conn_mod := ConnMod}} -> #{conninfo := #{conn_mod := ConnMod}} ->
erlang:apply(ConnMod, call, [Pid, Req]); call_conn(ConnMod, Pid, Req);
undefined -> undefined ->
{error, not_found} {error, not_found}
end end
@ -703,3 +703,13 @@ check_results(Results) ->
default_row_limit() -> default_row_limit() ->
?DEFAULT_ROW_LIMIT. ?DEFAULT_ROW_LIMIT.
call_conn(ConnMod, Pid, Req) ->
try
erlang:apply(ConnMod, call, [Pid, Req])
catch
exit:R when R =:= shutdown; R =:= normal ->
{error, shutdown};
exit:{R, _} when R =:= shutdown; R =:= noproc ->
{error, shutdown}
end.

View File

@ -90,6 +90,11 @@
message => <<"Client ID not found">> message => <<"Client ID not found">>
}). }).
-define(CLIENT_SHUTDOWN, #{
code => 'CLIENT_SHUTDOWN',
message => <<"Client connection has been shutdown">>
}).
namespace() -> undefined. namespace() -> undefined.
api_spec() -> api_spec() ->
@ -941,7 +946,7 @@ client_msgs_schema(OpId, Desc, ContExample, RespSchema) ->
['INVALID_PARAMETER'], <<"Invalid parameters">> ['INVALID_PARAMETER'], <<"Invalid parameters">>
), ),
404 => emqx_dashboard_swagger:error_codes( 404 => emqx_dashboard_swagger:error_codes(
['CLIENTID_NOT_FOUND'], <<"Client ID not found">> ['CLIENTID_NOT_FOUND', 'CLIENT_SHUTDOWN'], <<"Client ID not found">>
), ),
?NOT_IMPLEMENTED => emqx_dashboard_swagger:error_codes( ?NOT_IMPLEMENTED => emqx_dashboard_swagger:error_codes(
['NOT_IMPLEMENTED'], <<"API not implemented">> ['NOT_IMPLEMENTED'], <<"API not implemented">>
@ -1220,6 +1225,8 @@ list_client_msgs(MsgType, ClientID, QString) ->
case emqx_mgmt:list_client_msgs(MsgType, ClientID, PagerParams) of case emqx_mgmt:list_client_msgs(MsgType, ClientID, PagerParams) of
{error, not_found} -> {error, not_found} ->
{404, ?CLIENTID_NOT_FOUND}; {404, ?CLIENTID_NOT_FOUND};
{error, shutdown} ->
{404, ?CLIENT_SHUTDOWN};
{error, not_implemented} -> {error, not_implemented} ->
{?NOT_IMPLEMENTED, #{ {?NOT_IMPLEMENTED, #{
code => 'NOT_IMPLEMENTED', code => 'NOT_IMPLEMENTED',