fix: retry if init_disaptch failed

This commit is contained in:
Zhongwen Deng 2022-05-09 23:03:52 +08:00
parent 34ad395abe
commit 7c34c8a8b1
2 changed files with 20 additions and 8 deletions

View File

@ -443,6 +443,7 @@ fields("node") ->
#{ #{
mapping => "vm_args.-env ERL_CRASH_DUMP", mapping => "vm_args.-env ERL_CRASH_DUMP",
desc => ?DESC(node_crash_dump_file), desc => ?DESC(node_crash_dump_file),
default => "log/erl_crash.dump",
'readOnly' => true 'readOnly' => true
} }
)}, )},

View File

@ -38,7 +38,7 @@
]). ]).
is_ready(Timeout) -> is_ready(Timeout) ->
ready =:= gen_server:call(?MODULE, get_state, Timeout). ready =:= gen_server:call(?MODULE, is_ready, Timeout).
start_link() -> start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
@ -49,10 +49,13 @@ init([]) ->
{ok, undefined, {continue, regenerate_dispatch}}. {ok, undefined, {continue, regenerate_dispatch}}.
handle_continue(regenerate_dispatch, _State) -> handle_continue(regenerate_dispatch, _State) ->
regenerate_minirest_dispatch(), NewState = regenerate_minirest_dispatch(),
{noreply, ready, hibernate}. {noreply, NewState, hibernate}.
handle_call(get_state, _From, State) -> handle_call(is_ready, _From, retry) ->
NewState = regenerate_minirest_dispatch(),
{reply, NewState, NewState, hibernate};
handle_call(is_ready, _From, State) ->
{reply, State, State, hibernate}; {reply, State, State, hibernate};
handle_call(_Request, _From, State) -> handle_call(_Request, _From, State) ->
{reply, ok, State, hibernate}. {reply, ok, State, hibernate}.
@ -63,8 +66,8 @@ handle_cast(_Request, State) ->
handle_info({update_listeners, OldListeners, NewListeners}, _State) -> handle_info({update_listeners, OldListeners, NewListeners}, _State) ->
ok = emqx_dashboard:stop_listeners(OldListeners), ok = emqx_dashboard:stop_listeners(OldListeners),
ok = emqx_dashboard:start_listeners(NewListeners), ok = emqx_dashboard:start_listeners(NewListeners),
regenerate_minirest_dispatch(), NewState = regenerate_minirest_dispatch(),
{noreply, ready, hibernate}; {noreply, NewState, hibernate};
handle_info(_Info, State) -> handle_info(_Info, State) ->
{noreply, State, hibernate}. {noreply, State, hibernate}.
@ -84,9 +87,17 @@ regenerate_minirest_dispatch() ->
minirest:update_dispatch(element(1, Listener)) minirest:update_dispatch(element(1, Listener))
end, end,
emqx_dashboard:list_listeners() emqx_dashboard:list_listeners()
) ),
ready
catch catch
_:_ -> ok T:E:S ->
?SLOG(error, #{
msg => "regenerate_minirest_dispatch_failed",
reason => E,
type => T,
stacktrace => S
}),
retry
after after
emqx_dashboard:clear_i18n() emqx_dashboard:clear_i18n()
end. end.