فهرست منبع

refactor(exhook): remove hook registray

JianBo He 4 سال پیش
والد
کامیت
bb2033be13

+ 22 - 0
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.

+ 15 - 43
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)].
-
-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)
+     {Name, {M, F, _A}} <- ?ENABLED_HOOKS].
+
+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).

+ 0 - 21
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
 %%--------------------------------------------------------------------

+ 11 - 10
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)).