From bb2033be131e6fbbd8f297d3335f254df672b1d9 Mon Sep 17 00:00:00 2001 From: JianBo He Date: Tue, 6 Apr 2021 10:24:34 +0800 Subject: [PATCH] refactor(exhook): remove hook registray --- apps/emqx_exhook/include/emqx_exhook.hrl | 22 ++++++++ apps/emqx_exhook/src/emqx_exhook_app.erl | 56 +++++--------------- apps/emqx_exhook/src/emqx_exhook_handler.erl | 21 -------- apps/emqx_exhook/src/emqx_exhook_server.erl | 21 ++++---- 4 files changed, 47 insertions(+), 73 deletions(-) diff --git a/apps/emqx_exhook/include/emqx_exhook.hrl b/apps/emqx_exhook/include/emqx_exhook.hrl index 8a404ca39..301488619 100644 --- a/apps/emqx_exhook/include/emqx_exhook.hrl +++ b/apps/emqx_exhook/include/emqx_exhook.hrl @@ -19,4 +19,26 @@ -define(APP, emqx_exhook). +-define(ENABLED_HOOKS, + [ {'client.connect', {?MODULE, on_client_connect, []}} + , {'client.connack', {?MODULE, on_client_connack, []}} + , {'client.connected', {?MODULE, on_client_connected, []}} + , {'client.disconnected', {?MODULE, on_client_disconnected, []}} + , {'client.authenticate', {?MODULE, on_client_authenticate, []}} + , {'client.check_acl', {?MODULE, on_client_check_acl, []}} + , {'client.subscribe', {?MODULE, on_client_subscribe, []}} + , {'client.unsubscribe', {?MODULE, on_client_unsubscribe, []}} + , {'session.created', {?MODULE, on_session_created, []}} + , {'session.subscribed', {?MODULE, on_session_subscribed, []}} + , {'session.unsubscribed',{?MODULE, on_session_unsubscribed, []}} + , {'session.resumed', {?MODULE, on_session_resumed, []}} + , {'session.discarded', {?MODULE, on_session_discarded, []}} + , {'session.takeovered', {?MODULE, on_session_takeovered, []}} + , {'session.terminated', {?MODULE, on_session_terminated, []}} + , {'message.publish', {?MODULE, on_message_publish, []}} + , {'message.delivered', {?MODULE, on_message_delivered, []}} + , {'message.acked', {?MODULE, on_message_acked, []}} + , {'message.dropped', {?MODULE, on_message_dropped, []}} + ]). + -endif. diff --git a/apps/emqx_exhook/src/emqx_exhook_app.erl b/apps/emqx_exhook/src/emqx_exhook_app.erl index 3b829e7cd..62c1903bd 100644 --- a/apps/emqx_exhook/src/emqx_exhook_app.erl +++ b/apps/emqx_exhook/src/emqx_exhook_app.erl @@ -22,7 +22,7 @@ -emqx_plugin(extension). --define(REGISTRAY, emqx_exhook_registray). +-define(CNTER, emqx_exhook_counter). -export([ start/2 , stop/1 @@ -33,7 +33,8 @@ -export([ load_server/2 , unload_server/1 , unload_exhooks/0 - , init_hook_registray/0 + , init_hooks_cnter/0 + , deinit_hooks_cnter/0 ]). %%-------------------------------------------------------------------- @@ -43,8 +44,8 @@ start(_StartType, _StartArgs) -> {ok, Sup} = emqx_exhook_sup:start_link(), - %% Collect all available hooks - _ = init_hook_registray(), + %% Init counter + init_hooks_cnter(), %% Load all dirvers load_all_servers(), @@ -56,8 +57,8 @@ start(_StartType, _StartArgs) -> prep_stop(State) -> emqx_ctl:unregister_command(exhook), _ = unload_exhooks(), + _ = deinit_hooks_cnter(), ok = unload_all_servers(), - _ = deinit_hook_registray(), State. stop(_State) -> @@ -81,46 +82,17 @@ load_server(Name, Options) -> unload_server(Name) -> emqx_exhook:disable(Name). -%%-------------------------------------------------------------------- -%% Exhooks - -init_hook_registray() -> - _ = ets:new(?REGISTRAY, [public, named_table]), - [ets:insert(?REGISTRAY, {Name, {M, F, A}, 0}) - || {Name, {M, F, A}} <- search_exhooks()]. - unload_exhooks() -> [emqx:unhook(Name, {M, F}) || - {Name, {M, F, _A}, _} <- ets:tab2list(?REGISTRAY)]. + {Name, {M, F, _A}} <- ?ENABLED_HOOKS]. -deinit_hook_registray() -> - ets:delete(?REGISTRAY). - -search_exhooks() -> - search_exhooks(ignore_lib_apps(application:loaded_applications())). -search_exhooks(Apps) -> - lists:flatten([ExHooks || App <- Apps, {_App, _Mod, ExHooks} <- find_attrs(App, exhooks)]). - -ignore_lib_apps(Apps) -> - LibApps = [kernel, stdlib, sasl, appmon, eldap, erts, - syntax_tools, ssl, crypto, mnesia, os_mon, - inets, goldrush, gproc, runtime_tools, - snmp, otp_mibs, public_key, asn1, ssh, hipe, - common_test, observer, webtool, xmerl, tools, - test_server, compiler, debugger, eunit, et, - wx], - [AppName || {AppName, _, _} <- Apps, not lists:member(AppName, LibApps)]. - -find_attrs(App, Def) -> - [{App, Mod, Attr} || {ok, Modules} <- [application:get_key(App, modules)], - Mod <- Modules, - {Name, Attrs} <- module_attributes(Mod), Name =:= Def, - Attr <- Attrs]. - -module_attributes(Module) -> - try Module:module_info(attributes) +init_hooks_cnter() -> + try + _ = ets:new(?CNTER, [named_table, public]), ok catch - error:undef -> []; - error:Reason -> error(Reason) + exit:badarg:_ -> + ok end. +deinit_hooks_cnter() -> + ets:delete(?CNTER). diff --git a/apps/emqx_exhook/src/emqx_exhook_handler.erl b/apps/emqx_exhook/src/emqx_exhook_handler.erl index e03e23813..13c41ce6a 100644 --- a/apps/emqx_exhook/src/emqx_exhook_handler.erl +++ b/apps/emqx_exhook/src/emqx_exhook_handler.erl @@ -62,27 +62,6 @@ , call_fold/3 ]). --exhooks([ {'client.connect', {?MODULE, on_client_connect, []}} - , {'client.connack', {?MODULE, on_client_connack, []}} - , {'client.connected', {?MODULE, on_client_connected, []}} - , {'client.disconnected', {?MODULE, on_client_disconnected, []}} - , {'client.authenticate', {?MODULE, on_client_authenticate, []}} - , {'client.check_acl', {?MODULE, on_client_check_acl, []}} - , {'client.subscribe', {?MODULE, on_client_subscribe, []}} - , {'client.unsubscribe', {?MODULE, on_client_unsubscribe, []}} - , {'session.created', {?MODULE, on_session_created, []}} - , {'session.subscribed', {?MODULE, on_session_subscribed, []}} - , {'session.unsubscribed',{?MODULE, on_session_unsubscribed, []}} - , {'session.resumed', {?MODULE, on_session_resumed, []}} - , {'session.discarded', {?MODULE, on_session_discarded, []}} - , {'session.takeovered', {?MODULE, on_session_takeovered, []}} - , {'session.terminated', {?MODULE, on_session_terminated, []}} - , {'message.publish', {?MODULE, on_message_publish, []}} - , {'message.delivered', {?MODULE, on_message_delivered, []}} - , {'message.acked', {?MODULE, on_message_acked, []}} - , {'message.dropped', {?MODULE, on_message_dropped, []}} - ]). - %%-------------------------------------------------------------------- %% Clients %%-------------------------------------------------------------------- diff --git a/apps/emqx_exhook/src/emqx_exhook_server.erl b/apps/emqx_exhook/src/emqx_exhook_server.erl index 76a2e491d..5a353b61b 100644 --- a/apps/emqx_exhook/src/emqx_exhook_server.erl +++ b/apps/emqx_exhook/src/emqx_exhook_server.erl @@ -16,11 +16,12 @@ -module(emqx_exhook_server). +-include("emqx_exhook.hrl"). -include_lib("emqx/include/logger.hrl"). -logger_header("[ExHook Svr]"). --define(REGISTRAY, emqx_exhook_registray). +-define(CNTER, emqx_exhook_counter). -define(PB_CLIENT_MOD, emqx_exhook_v_1_hook_provider_client). %% Load/Unload @@ -187,25 +188,25 @@ ensure_metrics(Prefix, HookSpecs) -> ensure_hooks(HookSpecs) -> lists:foreach(fun(Hookpoint) -> - case ets:lookup(?REGISTRAY, Hookpoint) of - [] -> - ?LOG(warning, "Hoook ~s not found in registray", [Hookpoint]); - [{Hookpoint, {M, F, A}, _}] -> + case lists:keyfind(Hookpoint, 1, ?ENABLED_HOOKS) of + false -> + ?LOG(error, "Unknown name ~s to hook, skip it!", [Hookpoint]); + {Hookpoint, {M, F, A}} -> emqx_hooks:put(Hookpoint, {M, F, A}), - ets:update_counter(?REGISTRAY, Hookpoint, {3, 1}) + ets:update_counter(?CNTER, Hookpoint, {2, 1}, {Hookpoint, 0}) end end, maps:keys(HookSpecs)). may_unload_hooks(HookSpecs) -> lists:foreach(fun(Hookpoint) -> - case ets:update_counter(?REGISTRAY, Hookpoint, {3, -1}) of + case ets:update_counter(?CNTER, Hookpoint, {2, -1}, {Hookpoint, 0}) of Cnt when Cnt =< 0 -> - case ets:lookup(?REGISTRAY, Hookpoint) of - [{Hookpoint, {M, F, _A}, _}] -> + case lists:keyfind(Hookpoint, 1, ?ENABLED_HOOKS) of + {Hookpoint, {M, F, _A}} -> emqx_hooks:del(Hookpoint, {M, F}); _ -> ok end, - ets:delete(?REGISTRAY, Hookpoint); + ets:delete(?CNTER, Hookpoint); _ -> ok end end, maps:keys(HookSpecs)).