ソースを参照

Merge pull request #10923 from zmstone/0602-fix-channel-data-registration-race-condition

fix(emqx_cm): fix channel data registration race-condition
Zaiming (Stone) Shi 2 年 前
コミット
367fc95976
2 ファイル変更7 行追加1 行削除
  1. 3 1
      apps/emqx/src/emqx_cm.erl
  2. 4 0
      changes/ce/fix-10923.en.md

+ 3 - 1
apps/emqx/src/emqx_cm.erl

@@ -176,11 +176,13 @@ insert_channel_info(ClientId, Info, Stats) ->
 %% Note that: It should be called on a lock transaction
 register_channel(ClientId, ChanPid, #{conn_mod := ConnMod}) when is_pid(ChanPid) ->
     Chan = {ClientId, ChanPid},
+    %% cast (for process monitor) before inserting ets tables
+    cast({registered, Chan}),
     true = ets:insert(?CHAN_TAB, Chan),
     true = ets:insert(?CHAN_CONN_TAB, {Chan, ConnMod}),
     ok = emqx_cm_registry:register_channel(Chan),
     mark_channel_connected(ChanPid),
-    cast({registered, Chan}).
+    ok.
 
 %% @doc Unregister a channel.
 -spec unregister_channel(emqx_types:clientid()) -> ok.

+ 4 - 0
changes/ce/fix-10923.en.md

@@ -0,0 +1,4 @@
+Fix a race-condition in channel info registration.
+
+Prior to this fix, when system is under heavy load, it might happen that a client is disconnected (or has its session expired) but still can be found in the clients page in dashboard.
+One of the possible reasons is a race condition fixed in this PR: the connection is killed in the middle of channel data registration.