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),
case emqx_cm:get_chan_info(ClientId, Pid) of
#{conninfo := #{conn_mod := ConnMod}} ->
erlang:apply(ConnMod, call, [Pid, Req]);
call_conn(ConnMod, Pid, Req);
undefined ->
{error, not_found}
end
@ -703,3 +703,13 @@ check_results(Results) ->
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">>
}).
-define(CLIENT_SHUTDOWN, #{
code => 'CLIENT_SHUTDOWN',
message => <<"Client connection has been shutdown">>
}).
namespace() -> undefined.
api_spec() ->
@ -941,7 +946,7 @@ client_msgs_schema(OpId, Desc, ContExample, RespSchema) ->
['INVALID_PARAMETER'], <<"Invalid parameters">>
),
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'], <<"API not implemented">>
@ -1220,6 +1225,8 @@ list_client_msgs(MsgType, ClientID, QString) ->
case emqx_mgmt:list_client_msgs(MsgType, ClientID, PagerParams) of
{error, not_found} ->
{404, ?CLIENTID_NOT_FOUND};
{error, shutdown} ->
{404, ?CLIENT_SHUTDOWN};
{error, not_implemented} ->
{?NOT_IMPLEMENTED, #{
code => 'NOT_IMPLEMENTED',