Просмотр исходного кода

Merge pull request #14258 from qzhuyan/fix/william/lower-kick-shutdown-timeout

fix: lower kick shutdown timeout
William Yang 1 год назад
Родитель
Сommit
c18e76eb44
3 измененных файлов с 33 добавлено и 6 удалено
  1. 11 3
      apps/emqx/src/emqx_connection.erl
  2. 7 3
      apps/emqx/src/emqx_quic_stream.erl
  3. 15 0
      changes/ce/fix-14258.en.md

+ 11 - 3
apps/emqx/src/emqx_connection.erl

@@ -88,7 +88,7 @@
     %% TCP/TLS Transport
     transport :: esockd:transport(),
     %% TCP/TLS Socket
-    socket :: esockd:socket(),
+    socket :: esockd:socket() | emqx_quic_stream:socket(),
     %% Peername of the connection
     peername :: emqx_types:peername(),
     %% Sockname of the connection
@@ -1282,9 +1282,17 @@ set_tcp_keepalive({Type, Id}) ->
     end.
 
 -spec graceful_shutdown_transport(atom(), state()) -> state().
+graceful_shutdown_transport(
+    kicked,
+    S = #state{
+        transport = emqx_quic_stream,
+        socket = Socket
+    }
+) ->
+    _ = emqx_quic_stream:shutdown(Socket, read_write, 1000),
+    S#state{sockstate = closed};
 graceful_shutdown_transport(_Reason, S = #state{transport = Transport, socket = Socket}) ->
-    %% @TODO Reason is reserved for future use, quic transport
-    Transport:shutdown(Socket, read_write),
+    _ = Transport:shutdown(Socket, read_write),
     S#state{sockstate = closed}.
 
 %%--------------------------------------------------------------------

+ 7 - 3
apps/emqx/src/emqx_quic_stream.erl

@@ -33,6 +33,7 @@
     getstat/2,
     fast_close/1,
     shutdown/2,
+    shutdown/3,
     ensure_ok_or_exit/2,
     send/2,
     setopts/2,
@@ -62,7 +63,7 @@
 
 -export_type([socket/0]).
 
--opaque socket() :: {quic, connection_handle(), stream_handle(), socket_info()}.
+-type socket() :: {quic, connection_handle(), stream_handle(), socket_info()}.
 
 -type socket_info() :: #{
     is_orphan => boolean(),
@@ -153,9 +154,12 @@ fast_close({quic, _Conn, Stream, _Info}) ->
     % quicer:async_shutdown_connection(Conn, ?QUIC_CONNECTION_SHUTDOWN_FLAG_NONE, 0),
     ok.
 
-shutdown({quic, _Conn, Stream, _Info}, read_write) ->
+shutdown(Socket, Dir) ->
+    shutdown(Socket, Dir, 3000).
+
+shutdown({quic, _Conn, Stream, _Info}, read_write, Timeout) ->
     %% A graceful shutdown means both side shutdown the read and write gracefully.
-    quicer:shutdown_stream(Stream, ?QUIC_STREAM_SHUTDOWN_FLAG_GRACEFUL, 1, 5000).
+    quicer:shutdown_stream(Stream, ?QUIC_STREAM_SHUTDOWN_FLAG_GRACEFUL, 1, Timeout).
 
 -spec ensure_ok_or_exit(atom(), list(term())) -> term().
 ensure_ok_or_exit(Fun, Args = [Sock | _]) when is_atom(Fun), is_list(Args) ->

+ 15 - 0
changes/ce/fix-14258.en.md

@@ -0,0 +1,15 @@
+Lower QUIC connection shutdown timeout.
+
+For QUIC connection graceful shutdown, we used to have 5s timeout.
+
+If the client is unresponsive for graceful shutdown, EMQX may generate some warning logs:
+
+```
+[warning] msg: session_stepdown_request_timeout, action: discard, 
+```
+or 
+
+timeout the dashboard if kick the client via dashboard. 
+
+Now lower it to 1s for reason `kick` and 3s for the others.
+