diff --git a/src/emqx_cm.erl b/src/emqx_cm.erl index 397b3b7af..12043346e 100644 --- a/src/emqx_cm.erl +++ b/src/emqx_cm.erl @@ -534,4 +534,11 @@ decrement_connected_client_count() -> get_connected_client_count() -> CRef = persistent_term:get({?MODULE, ?CONN_CLIENT_CTR}), - max(0, counters:get(CRef, ?CONN_CLIENT_CTR_IDX)). + %% check if inconsistent; if so, reset to 0 + case counters:get(CRef, ?CONN_CLIENT_CTR_IDX) of + N when N < 0 -> + counters:put(CRef, ?CONN_CLIENT_CTR_IDX, 0), + 0; + N -> + N + end. diff --git a/test/emqx_broker_SUITE.erl b/test/emqx_broker_SUITE.erl index b6531a4c0..66ed608f9 100644 --- a/test/emqx_broker_SUITE.erl +++ b/test/emqx_broker_SUITE.erl @@ -422,6 +422,20 @@ t_connected_client_stats({'end', _Config}) -> {ok, _} = supervisor:restart_child(emqx_kernel_sup, emqx_stats), ok. +%% alwayseven if +t_connect_client_never_negative({init, Config}) -> + Config; +t_connect_client_never_negative(Config) when is_list(Config) -> + ?assertEqual(0, emqx_cm:get_connected_client_count()), + %% would go to -1 + emqx_cm:decrement_connected_client_count(), + ?assertEqual(0, emqx_cm:get_connected_client_count()), + %% would be 0, if really went to -1 + emqx_cm:increment_connected_client_count(), + ?assertEqual(1, emqx_cm:get_connected_client_count()), + ok; +t_connect_client_never_negative({'end', _Config}) -> + ok. wait_for_events(Action, Kinds) -> wait_for_events(Action, Kinds, 100).