refactor(exhook): remove hook registray

This commit is contained in:
JianBo He 2021-04-06 10:24:34 +08:00
parent 8bf0106556
commit bb2033be13
4 changed files with 47 additions and 73 deletions

View File

@ -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.

View File

@ -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).

View File

@ -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
%%--------------------------------------------------------------------

View File

@ -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)).