refactor: use `spawn_link` instead of `spawn_monitor`
This should cover the case when the resource manager is brutally killed.
This commit is contained in:
parent
475077c798
commit
5cf92dcb73
|
@ -556,22 +556,22 @@ handle_event(
|
||||||
{keep_state_and_data, {reply, From, {ok, Channels}}};
|
{keep_state_and_data, {reply, From, {ok, Channels}}};
|
||||||
handle_event(
|
handle_event(
|
||||||
info,
|
info,
|
||||||
{'DOWN', Ref, process, Pid, Res},
|
{'EXIT', Pid, Res},
|
||||||
State0,
|
State0,
|
||||||
Data0 = #data{hc_workers = #{resource := RHCWorkers}}
|
Data0 = #data{hc_workers = #{resource := RHCWorkers}}
|
||||||
) when
|
) when
|
||||||
is_map_key({Pid, Ref}, RHCWorkers)
|
is_map_key(Pid, RHCWorkers)
|
||||||
->
|
->
|
||||||
handle_resource_health_check_worker_down(State0, Data0, {Pid, Ref}, Res);
|
handle_resource_health_check_worker_down(State0, Data0, Pid, Res);
|
||||||
handle_event(
|
handle_event(
|
||||||
info,
|
info,
|
||||||
{'DOWN', Ref, process, Pid, Res},
|
{'EXIT', Pid, Res},
|
||||||
_State,
|
_State,
|
||||||
Data0 = #data{hc_workers = #{channel := CHCWorkers}}
|
Data0 = #data{hc_workers = #{channel := CHCWorkers}}
|
||||||
) when
|
) when
|
||||||
is_map_key({Pid, Ref}, CHCWorkers)
|
is_map_key(Pid, CHCWorkers)
|
||||||
->
|
->
|
||||||
handle_channel_health_check_worker_down(Data0, {Pid, Ref}, Res);
|
handle_channel_health_check_worker_down(Data0, Pid, Res);
|
||||||
% Ignore all other events
|
% Ignore all other events
|
||||||
handle_event(EventType, EventData, State, Data) ->
|
handle_event(EventType, EventData, State, Data) ->
|
||||||
?SLOG(
|
?SLOG(
|
||||||
|
@ -802,14 +802,14 @@ terminate_health_check_workers(Data) ->
|
||||||
hc_pending_callers = #{resource := RPending, channel := CPending}
|
hc_pending_callers = #{resource := RPending, channel := CPending}
|
||||||
} = Data,
|
} = Data,
|
||||||
maps:foreach(
|
maps:foreach(
|
||||||
fun({Pid, _Ref}, _) ->
|
fun(Pid, _) ->
|
||||||
exit(Pid, kill)
|
exit(Pid, kill)
|
||||||
end,
|
end,
|
||||||
RHCWorkers
|
RHCWorkers
|
||||||
),
|
),
|
||||||
maps:foreach(
|
maps:foreach(
|
||||||
fun
|
fun
|
||||||
({Pid, _Ref}, _) when is_pid(Pid) ->
|
(Pid, _) when is_pid(Pid) ->
|
||||||
exit(Pid, kill);
|
exit(Pid, kill);
|
||||||
(_, _) ->
|
(_, _) ->
|
||||||
ok
|
ok
|
||||||
|
@ -947,14 +947,14 @@ start_resource_health_check(#data{hc_workers = #{resource := HCWorkers}}) when
|
||||||
keep_state_and_data;
|
keep_state_and_data;
|
||||||
start_resource_health_check(#data{} = Data0) ->
|
start_resource_health_check(#data{} = Data0) ->
|
||||||
#data{hc_workers = HCWorkers0 = #{resource := RHCWorkers0}} = Data0,
|
#data{hc_workers = HCWorkers0 = #{resource := RHCWorkers0}} = Data0,
|
||||||
WorkerRef = {_Pid, _Ref} = spawn_resource_health_check_worker(Data0),
|
WorkerPid = spawn_resource_health_check_worker(Data0),
|
||||||
HCWorkers = HCWorkers0#{resource := RHCWorkers0#{WorkerRef => true}},
|
HCWorkers = HCWorkers0#{resource := RHCWorkers0#{WorkerPid => true}},
|
||||||
Data = Data0#data{hc_workers = HCWorkers},
|
Data = Data0#data{hc_workers = HCWorkers},
|
||||||
{keep_state, Data}.
|
{keep_state, Data}.
|
||||||
|
|
||||||
-spec spawn_resource_health_check_worker(data()) -> {pid(), reference()}.
|
-spec spawn_resource_health_check_worker(data()) -> pid().
|
||||||
spawn_resource_health_check_worker(#data{} = Data) ->
|
spawn_resource_health_check_worker(#data{} = Data) ->
|
||||||
spawn_monitor(?MODULE, worker_resource_health_check, [Data]).
|
spawn_link(?MODULE, worker_resource_health_check, [Data]).
|
||||||
|
|
||||||
%% separated so it can be spec'ed and placate dialyzer tantrums...
|
%% separated so it can be spec'ed and placate dialyzer tantrums...
|
||||||
-spec worker_resource_health_check(data()) -> no_return().
|
-spec worker_resource_health_check(data()) -> no_return().
|
||||||
|
@ -1242,13 +1242,13 @@ continue_channel_health_check_connected(ChannelId, OldStatus, Data0) ->
|
||||||
-spec start_channel_health_check(data(), channel_id()) -> data().
|
-spec start_channel_health_check(data(), channel_id()) -> data().
|
||||||
start_channel_health_check(#data{} = Data0, ChannelId) ->
|
start_channel_health_check(#data{} = Data0, ChannelId) ->
|
||||||
#data{hc_workers = HCWorkers0 = #{channel := CHCWorkers0}} = Data0,
|
#data{hc_workers = HCWorkers0 = #{channel := CHCWorkers0}} = Data0,
|
||||||
WorkerRef = {_Pid, _Ref} = spawn_channel_health_check_worker(Data0, ChannelId),
|
WorkerPid = spawn_channel_health_check_worker(Data0, ChannelId),
|
||||||
HCWorkers = HCWorkers0#{channel := CHCWorkers0#{WorkerRef => ChannelId}},
|
HCWorkers = HCWorkers0#{channel := CHCWorkers0#{WorkerPid => ChannelId}},
|
||||||
Data0#data{hc_workers = HCWorkers}.
|
Data0#data{hc_workers = HCWorkers}.
|
||||||
|
|
||||||
-spec spawn_channel_health_check_worker(data(), channel_id()) -> {pid(), reference()}.
|
-spec spawn_channel_health_check_worker(data(), channel_id()) -> pid().
|
||||||
spawn_channel_health_check_worker(#data{} = Data, ChannelId) ->
|
spawn_channel_health_check_worker(#data{} = Data, ChannelId) ->
|
||||||
spawn_monitor(?MODULE, worker_channel_health_check, [Data, ChannelId]).
|
spawn_link(?MODULE, worker_channel_health_check, [Data, ChannelId]).
|
||||||
|
|
||||||
%% separated so it can be spec'ed and placate dialyzer tantrums...
|
%% separated so it can be spec'ed and placate dialyzer tantrums...
|
||||||
-spec worker_channel_health_check(data(), channel_id()) -> no_return().
|
-spec worker_channel_health_check(data(), channel_id()) -> no_return().
|
||||||
|
|
Loading…
Reference in New Issue