diff --git a/etc/emqx.conf b/etc/emqx.conf index 7876be59b..f38cc1a13 100644 --- a/etc/emqx.conf +++ b/etc/emqx.conf @@ -1898,6 +1898,11 @@ plugins.expand_plugins_dir = {{ platform_plugins_dir }}/ ## Default: 1m, 1 minute broker.sys_interval = 1m +## Enable global session registry. +## +## Value: on | off +broker.enable_session_registry = on + ## Session locking strategy in a cluster. ## ## Value: Enum diff --git a/priv/emqx.schema b/priv/emqx.schema index 1001ab5a8..93b27f0ae 100644 --- a/priv/emqx.schema +++ b/priv/emqx.schema @@ -1723,6 +1723,11 @@ end}. {default, "1m"} ]}. +{mapping, "broker.enable_session_registry", "emqx.enable_session_registry", [ + {default, on}, + {datatype, flag} +]}. + {mapping, "broker.session_locking_strategy", "emqx.session_locking_strategy", [ {default, quorum}, {datatype, {enum, [local,one,quorum,all]}} diff --git a/src/emqx_sm_registry.erl b/src/emqx_sm_registry.erl index 3b472e2c8..1d0df61bf 100644 --- a/src/emqx_sm_registry.erl +++ b/src/emqx_sm_registry.erl @@ -20,7 +20,6 @@ -export([start_link/0]). -export([is_enabled/0]). - -export([register_session/1, lookup_session/1, unregister_session/1]). %% gen_server callbacks @@ -41,7 +40,8 @@ start_link() -> gen_server:start_link({local, ?REGISTRY}, ?MODULE, [], []). -spec(is_enabled() -> boolean()). -is_enabled() -> ets:info(?TAB, name) =/= undefined. +is_enabled() -> + emqx_config:get_env(enable_session_registry, true). -spec(lookup_session(emqx_types:client_id()) -> list({emqx_types:client_id(), session_pid()})). @@ -50,11 +50,17 @@ lookup_session(ClientId) -> -spec(register_session({emqx_types:client_id(), session_pid()}) -> ok). register_session({ClientId, SessPid}) when is_binary(ClientId), is_pid(SessPid) -> - mnesia:dirty_write(?TAB, record(ClientId, SessPid)). + case is_enabled() of + true -> mnesia:dirty_write(?TAB, record(ClientId, SessPid)); + false -> ok + end. -spec(unregister_session({emqx_types:client_id(), session_pid()}) -> ok). unregister_session({ClientId, SessPid}) when is_binary(ClientId), is_pid(SessPid) -> - mnesia:dirty_delete_object(?TAB, record(ClientId, SessPid)). + case is_enabled() of + true -> mnesia:dirty_delete_object(?TAB, record(ClientId, SessPid)); + false -> ok + end. record(ClientId, SessPid) -> #global_session{sid = ClientId, pid = SessPid}.