diff --git a/apps/emqx/src/emqx_cm.erl b/apps/emqx/src/emqx_cm.erl index ebcf9c434..db3d48f5d 100644 --- a/apps/emqx/src/emqx_cm.erl +++ b/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. diff --git a/changes/ce/fix-10923.en.md b/changes/ce/fix-10923.en.md new file mode 100644 index 000000000..accd547fc --- /dev/null +++ b/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.