diff --git a/apps/emqx_resource/src/emqx_resource_health_check.erl b/apps/emqx_resource/src/emqx_resource_health_check.erl index f50b53e63..da5492a33 100644 --- a/apps/emqx_resource/src/emqx_resource_health_check.erl +++ b/apps/emqx_resource/src/emqx_resource_health_check.erl @@ -15,38 +15,38 @@ %%-------------------------------------------------------------------- -module(emqx_resource_health_check). --export([ start_link/2 - , create_checker/2 +-export([ start_link/3 + , create_checker/3 , delete_checker/1 ]). --export([ start_health_check/2 - , health_check_timeout_checker/3 +-export([ start_health_check/3 + , health_check_timeout_checker/4 ]). -define(SUP, emqx_resource_health_check_sup). -define(ID(NAME), {resource_health_check, NAME}). -child_spec(Name, Sleep) -> +child_spec(Name, Sleep, Timeout) -> #{id => ?ID(Name), - start => {?MODULE, start_link, [Name, Sleep]}, + start => {?MODULE, start_link, [Name, Sleep, Timeout]}, restart => transient, shutdown => 5000, type => worker, modules => [?MODULE]}. -start_link(Name, Sleep) -> - Pid = proc_lib:spawn_link(?MODULE, start_health_check, [Name, Sleep]), +start_link(Name, Sleep, Timeout) -> + Pid = proc_lib:spawn_link(?MODULE, start_health_check, [Name, Sleep, Timeout]), {ok, Pid}. -create_checker(Name, Sleep) -> - create_checker(Name, Sleep, false). +create_checker(Name, Sleep, Timeout) -> + create_checker(Name, Sleep, false, Timeout). -create_checker(Name, Sleep, Retry) -> - case supervisor:start_child(?SUP, child_spec(Name, Sleep)) of +create_checker(Name, Sleep, Retry, Timeout) -> + case supervisor:start_child(?SUP, child_spec(Name, Sleep, Timeout)) of {ok, _} -> ok; {error, already_present} -> ok; {error, {already_started, _}} when Retry == false -> ok = delete_checker(Name), - create_checker(Name, Sleep, true); + create_checker(Name, Sleep, true, Timeout); Error -> Error end. @@ -56,9 +56,9 @@ delete_checker(Name) -> Error -> Error end. -start_health_check(Name, Sleep) -> +start_health_check(Name, Sleep, Timeout) -> Pid = self(), - _ = proc_lib:spawn_link(?MODULE, health_check_timeout_checker, [Pid, Name, Sleep]), + _ = proc_lib:spawn_link(?MODULE, health_check_timeout_checker, [Pid, Name, Sleep, Timeout]), health_check(Name). health_check(Name) -> @@ -75,12 +75,12 @@ health_check(Name) -> end, health_check(Name). -health_check_timeout_checker(Pid, Name, SleepTime) -> +health_check_timeout_checker(Pid, Name, SleepTime, Timeout) -> SelfPid = self(), Pid ! {SelfPid, begin_health_check}, receive health_check_finish -> timer:sleep(SleepTime) - after 10000 -> + after Timeout -> emqx_alarm:activate(Name, #{name => Name}, <>), emqx_resource:set_resource_status_stoped(Name), @@ -88,4 +88,4 @@ health_check_timeout_checker(Pid, Name, SleepTime) -> health_check_finish -> timer:sleep(SleepTime) end end, - health_check_timeout_checker(Pid, Name, SleepTime). + health_check_timeout_checker(Pid, Name, SleepTime, Timeout). diff --git a/apps/emqx_resource/src/emqx_resource_instance.erl b/apps/emqx_resource/src/emqx_resource_instance.erl index 6308a5d60..0cdeeae50 100644 --- a/apps/emqx_resource/src/emqx_resource_instance.erl +++ b/apps/emqx_resource/src/emqx_resource_instance.erl @@ -249,7 +249,8 @@ start_and_check(InstId, ResourceType, Config, Opts, Data) -> case maps:get(async_create, Opts, false) of false -> do_health_check(Data2); true -> emqx_resource_health_check:create_checker(InstId, - maps:get(health_check_interval, Opts, 15000)) + maps:get(health_check_interval, Opts, 15000), + maps:get(health_check_timeout, Opts, 10000)) end; {error, Reason} -> ets:insert(emqx_resource_instance, {InstId, Data#{status => stopped}}), diff --git a/apps/emqx_resource/test/emqx_resource_SUITE.erl b/apps/emqx_resource/test/emqx_resource_SUITE.erl index d632523c5..bea8b350f 100644 --- a/apps/emqx_resource/test/emqx_resource_SUITE.erl +++ b/apps/emqx_resource/test/emqx_resource_SUITE.erl @@ -148,7 +148,7 @@ t_healthy(_) -> #{async_create => true}), timer:sleep(300), - emqx_resource_health_check:create_checker(?ID, 15000), + emqx_resource_health_check:create_checker(?ID, 15000, 10000), #{pid := Pid} = emqx_resource:query(?ID, get_state), timer:sleep(300), emqx_resource:set_resource_status_stoped(?ID),