refactor(exhook): remove hook registray
This commit is contained in:
parent
8bf0106556
commit
bb2033be13
|
@ -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.
|
||||
|
|
|
@ -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).
|
||||
|
|
|
@ -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
|
||||
%%--------------------------------------------------------------------
|
||||
|
|
|
@ -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)).
|
||||
|
|
Loading…
Reference in New Issue