Преглед на файлове

fix(exhook): ignore the exhook server load error when config update

firest преди 3 години
родител
ревизия
ed73001901
променени са 2 файла, в които са добавени 28 реда и са изтрити 38 реда
  1. 25 35
      apps/emqx_exhook/src/emqx_exhook_mgr.erl
  2. 3 3
      apps/emqx_exhook/src/emqx_exhook_server.erl

+ 25 - 35
apps/emqx_exhook/src/emqx_exhook_mgr.erl

@@ -218,10 +218,10 @@ load_all_servers([#{name := Name} = Options | More], Waiting, Running, Stopped)
         {ok, ServerState} ->
             save(Name, ServerState),
             load_all_servers(More, Waiting, Running#{Name => Options}, Stopped);
-        {error, _} ->
-            load_all_servers(More, Waiting#{Name => Options}, Running, Stopped);
         disable ->
-            load_all_servers(More, Waiting, Running, Stopped#{Name => Options})
+            load_all_servers(More, Waiting, Running, Stopped#{Name => Options});
+        {_, _} ->
+            load_all_servers(More, Waiting#{Name => Options}, Running, Stopped)
     end;
 load_all_servers([], Waiting, Running, Stopped) ->
     {Waiting, Running, Stopped}.
@@ -277,11 +277,11 @@ handle_call(
         {ok, ServerState} ->
             save(Name, ServerState),
             State2 = State#{running := Running#{Name => Conf}};
-        {error, _} ->
-            StateT = State#{waiting := Waitting#{Name => Conf}},
-            State2 = ensure_reload_timer(StateT);
         disable ->
-            State2 = State#{stopped := Stopped#{Name => Conf}}
+            State2 = State#{stopped := Stopped#{Name => Conf}};
+        {_, _} ->
+            StateT = State#{waiting := Waitting#{Name => Conf}},
+            State2 = ensure_reload_timer(StateT)
     end,
     Orders = reorder(NewConfL),
     {reply, ok, State2#{orders := Orders}};
@@ -352,23 +352,8 @@ handle_cast(_Msg, State) ->
     {noreply, State}.
 
 handle_info({timeout, _Ref, {reload, Name}}, State) ->
-    {Result, NState} = do_load_server(Name, State),
-    case Result of
-        ok ->
-            {noreply, NState};
-        {error, not_found} ->
-            {noreply, NState};
-        {error, Reason} ->
-            ?SLOG(
-                warning,
-                #{
-                    msg => "failed_to_reload_exhook_callback_server",
-                    reason => Reason,
-                    name => Name
-                }
-            ),
-            {noreply, ensure_reload_timer(NState)}
-    end;
+    NState = do_load_server(Name, State),
+    {noreply, NState};
 handle_info(refresh_tick, State) ->
     refresh_tick(),
     emqx_exhook_metrics:update(?REFRESH_INTERVAL),
@@ -402,8 +387,7 @@ unload_exhooks() ->
     ].
 
 -spec do_load_server(server_name(), state()) ->
-    {{error, not_found}, state()}
-    | {{error, already_started}, state()}
+    {{error, term()}, state()}
     | {ok, state()}.
 do_load_server(Name, State = #{orders := Orders}) ->
     case where_is_server(Name, State) of
@@ -417,6 +401,7 @@ do_load_server(Name, State = #{orders := Orders}) ->
             State3 = State2#{Where := Map2},
             #{
                 running := Running,
+                waiting := Waiting,
                 stopped := Stopped
             } = State3,
             case emqx_exhook_server:load(Name, Options) of
@@ -428,10 +413,20 @@ do_load_server(Name, State = #{orders := Orders}) ->
                         name => Name
                     }),
                     {ok, State3#{running := maps:put(Name, Options, Running)}};
-                {error, Reason} ->
-                    {{error, Reason}, State};
                 disable ->
-                    {ok, State3#{stopped := Stopped#{Name => Options}}}
+                    {ok, State3#{stopped := Stopped#{Name => Options}}};
+                {load_error, _} ->
+                    {ok, ensure_reload_timer(State3#{waiting := maps:put(Name, Options, Waiting)})};
+                {_, Reason} ->
+                    ?SLOG(
+                        warning,
+                        #{
+                            msg => "failed_to_load_exhook_callback_server",
+                            reason => Reason,
+                            name => Name
+                        }
+                    ),
+                    {ok, State}
             end
     end.
 
@@ -607,12 +602,7 @@ restart_server(Name, ConfL, State) ->
                 {Where, Map} ->
                     State2 = State#{Where := Map#{Name := Conf}},
                     {ok, State3} = do_unload_server(Name, State2),
-                    case do_load_server(Name, State3) of
-                        {ok, State4} ->
-                            {ok, State4};
-                        {Error, State4} ->
-                            {Error, State4}
-                    end
+                    do_load_server(Name, State3)
             end
     end.
 

+ 3 - 3
apps/emqx_exhook/src/emqx_exhook_server.erl

@@ -86,7 +86,7 @@
 %% Load/Unload APIs
 %%--------------------------------------------------------------------
 
--spec load(binary(), map()) -> {ok, server()} | {error, term()} | disable.
+-spec load(binary(), map()) -> {ok, server()} | {error, term()} | {load_error, term()} | disable.
 load(_Name, #{enable := false}) ->
     disable;
 load(Name, #{request_timeout := Timeout, failed_action := FailedAction} = Opts) ->
@@ -114,9 +114,9 @@ load(Name, #{request_timeout := Timeout, failed_action := FailedAction} = Opts)
                         hookspec => HookSpecs,
                         prefix => Prefix
                     }};
-                {error, _} = E ->
+                {error, Reason} ->
                     emqx_exhook_sup:stop_grpc_client_channel(Name),
-                    E
+                    {load_error, Reason}
             end;
         {error, _} = E ->
             E