From 8a75b5305234b9197c2c3f4073438e6de0f8cd68 Mon Sep 17 00:00:00 2001 From: lafirest Date: Fri, 18 Feb 2022 11:03:32 +0800 Subject: [PATCH] fix(emqx_slow_subs): add upgrade/downgrade action --- .../src/emqx_plugin_libs.appup.src | 12 +++---- .../src/emqx_slow_subs/emqx_slow_subs.erl | 31 ++++++++++++++++++- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/apps/emqx_plugin_libs/src/emqx_plugin_libs.appup.src b/apps/emqx_plugin_libs/src/emqx_plugin_libs.appup.src index 64e2b7d24..10095eed0 100644 --- a/apps/emqx_plugin_libs/src/emqx_plugin_libs.appup.src +++ b/apps/emqx_plugin_libs/src/emqx_plugin_libs.appup.src @@ -1,13 +1,13 @@ %% -*- mode: erlang -*- {VSN, [{"4.4.0", - [ {load_module,emqx_slow_subs,brutal_purge,soft_purge,[]} + [ {update, emqx_slow_subs, {advanced, ["4.4.0"]}} , {load_module,emqx_slow_subs_api,brutal_purge,soft_purge,[]} ]}, {<<".*">>,[]}], - [{"4.4.0", - [ {load_module,emqx_slow_subs,brutal_purge,soft_purge,[]} - , {load_module,emqx_slow_subs_api,brutal_purge,soft_purge,[]} - ]}, - {<<".*">>,[]}] + [{"4.4.0", + [ {update, emqx_slow_subs, {advanced, ["4.4.0"]}} + , {load_module,emqx_slow_subs_api,brutal_purge,soft_purge,[]} + ]}, + {<<".*">>,[]}] }. diff --git a/apps/emqx_plugin_libs/src/emqx_slow_subs/emqx_slow_subs.erl b/apps/emqx_plugin_libs/src/emqx_slow_subs/emqx_slow_subs.erl index f047b7f5b..947a0e4b9 100644 --- a/apps/emqx_plugin_libs/src/emqx_slow_subs/emqx_slow_subs.erl +++ b/apps/emqx_plugin_libs/src/emqx_slow_subs/emqx_slow_subs.erl @@ -180,7 +180,36 @@ terminate(_Reason, _) -> unload(), ok. -code_change(_OldVsn, State, _Extra) -> +code_change({down, _Vsn}, #{config := Cfg} = State, ["4.4.0"]) -> + unload(), + + MaxSize = get_value(top_k_num, Cfg), + _ = emqx:hook('message.slow_subs_stats', + {?MODULE, on_stats_update, [#{max_size => MaxSize}]}), + + erlang:send_after(?EXPIRE_CHECK_INTERVAL, self(), ?FUNCTION_NAME), + + {ok, State}; + +code_change(_OldVsn, #{config := Conf} = State, ["4.4.0"]) -> + HookPoint = 'message.slow_subs_stats', + case emqx_hooks:lookup(HookPoint) of + [Action | _] -> + emqx_hooks:del(HookPoint, Action); + _ -> + ok + end, + try + ets:delete_all_objects(?TOPK_TAB) + catch _:_ -> + ok + end, + init_tab(), + expire_tick(Conf), + load(Conf), + {ok, State}; + +code_change(_OldVsn, State, _Extras) -> {ok, State}. %%--------------------------------------------------------------------