diff --git a/apps/emqx_gateway_mqttsn/src/emqx_gateway_mqttsn.erl b/apps/emqx_gateway_mqttsn/src/emqx_gateway_mqttsn.erl index 167ee465c..1e32c5b85 100644 --- a/apps/emqx_gateway_mqttsn/src/emqx_gateway_mqttsn.erl +++ b/apps/emqx_gateway_mqttsn/src/emqx_gateway_mqttsn.erl @@ -125,5 +125,6 @@ on_gateway_unload( }, _GwState ) -> + emqx_mqttsn_registry:clean_predefined_topics(GwName, maps:get(predefined, Config, [])), Listeners = normalize_config(Config), stop_listeners(GwName, Listeners). diff --git a/apps/emqx_gateway_mqttsn/src/emqx_mqttsn_registry.erl b/apps/emqx_gateway_mqttsn/src/emqx_mqttsn_registry.erl index 9db355a9b..e0e138531 100644 --- a/apps/emqx_gateway_mqttsn/src/emqx_mqttsn_registry.erl +++ b/apps/emqx_gateway_mqttsn/src/emqx_mqttsn_registry.erl @@ -26,7 +26,8 @@ -export([ register_topic/3, - unregister_topic/2 + unregister_topic/2, + clean_predefined_topics/2 ]). -export([ @@ -118,6 +119,16 @@ lookup_element(Tab, Key, Pos) -> unregister_topic({_, Pid}, ClientId) -> gen_server:call(Pid, {unregister, ClientId}). +-spec clean_predefined_topics(atom(), list()) -> ok. +clean_predefined_topics(InstaId, PredefTopics) when is_list(PredefTopics) -> + Tab = name(InstaId), + F = fun(#{id := TopicId, topic := TopicName0}) -> + TopicName = iolist_to_binary(TopicName0), + mria:dirty_delete(Tab, {predef, TopicId}), + mria:dirty_delete(Tab, {predef, TopicName}) + end, + lists:foreach(F, PredefTopics). + lookup_name(Pid) -> gen_server:call(Pid, name).