From 6fc50d11f8025b210b6959961aabe06da38792cc Mon Sep 17 00:00:00 2001 From: JianBo He Date: Tue, 6 Jun 2023 19:34:23 +0800 Subject: [PATCH] fix(mqttsn): clean pre-defined topics once gateway reloaded --- .../emqx_gateway_mqttsn/src/emqx_gateway_mqttsn.erl | 1 + .../src/emqx_mqttsn_registry.erl | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) 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).