Compare commits

..

2 Commits

Author SHA1 Message Date
Ulf Wiger
c61ce6df1a Handle empty nonces (zx vsn 0.4.5) 2025-06-16 22:29:00 +02:00
Ulf Wiger
672f2f75c9 reset worker on report error 2025-06-12 15:46:54 +02:00
3 changed files with 17 additions and 13 deletions

View File

@ -1,6 +1,6 @@
{application,gmhive_client, {application,gmhive_client,
[{description,"Gajumaru Hive Client"}, [{description,"Gajumaru Hive Client"},
{vsn,"0.4.3"}, {vsn,"0.4.5"},
{registered,[]}, {registered,[]},
{applications,[kernel,stdlib,sasl,gproc,inets,ssl,enoise, {applications,[kernel,stdlib,sasl,gproc,inets,ssl,enoise,
gmconfig,gmhive_protocol,gmhive_worker]}, gmconfig,gmhive_protocol,gmhive_worker]},

View File

@ -107,13 +107,16 @@ handle_cast({from_pool, #{via := Connector,
%% We could check whether we have already received the candidate ... %% We could check whether we have already received the candidate ...
%% For now, stop all workers, restart with new candidate %% For now, stop all workers, restart with new candidate
try try
% Most of the time we don't want to stop the worker. If we do, though, then %% Most of the time we don't want to stop the worker. If we do, though, then
% we need to do it more carefully than this, or memory usage will triple. %% we need to do it more carefully than this, or memory usage will triple.
% Workers1 = stop_workers(Workers), %% Workers1 = stop_workers(Workers),
{Workers2, Cand1} = assign_nonces(Workers, Cand), %%
#st{candidate = Cand2} = S1 = maybe_request_nonces(S#st{candidate = Cand1}), %% Nonces may be [], in which case we need to request new nonces first.
NewWorkers = [spawn_worker(W, Cand2) || W <- Workers2], #st{candidate = Cand1} = S1 = maybe_request_nonces(S#st{candidate = Cand}),
{noreply, S1#st{workers = NewWorkers}} {Workers2, Cand2} = assign_nonces(Workers, Cand1),
#st{candidate = Cand3} = S2 = maybe_request_nonces(S1#st{candidate = Cand2}),
NewWorkers = [spawn_worker(W, Cand3) || W <- Workers2],
{noreply, S2#st{workers = NewWorkers}}
catch catch
Cat:Err:St -> Cat:Err:St ->
?LOG_ERROR("CAUGHT ~p:~p / ~p", [Cat, Err, St]), ?LOG_ERROR("CAUGHT ~p:~p / ~p", [Cat, Err, St]),
@ -272,13 +275,14 @@ incr_worker_error(#worker{errors = Es, index = I} = W, Ws) ->
W1 = reset_worker_(W#worker{errors = Es+1}), W1 = reset_worker_(W#worker{errors = Es+1}),
lists:keyreplace(I, #worker.index, Ws, W1). lists:keyreplace(I, #worker.index, Ws, W1).
maybe_continue(stopped, _, S) -> %% maybe_continue(stopped, _, S) ->
S; %% S;
maybe_continue(continue, W, S) -> maybe_continue(continue, W, S) ->
maybe_restart_worker(W, S); maybe_restart_worker(W, S);
maybe_continue(error, W, S) -> maybe_continue(error, W, S) ->
?LOG_INFO("Won't restart worker ~p due to error", [W#worker.index]), ?LOG_INFO("Won't restart worker ~p due to error", [W#worker.index]),
S. Ws = reset_worker(W, S#st.workers),
S#st{workers = Ws}.
maybe_restart_worker(#worker{index = I} = W, #st{candidate = C} = S) -> maybe_restart_worker(#worker{index = I} = W, #st{candidate = C} = S) ->
case maps:get(nonces, C) of case maps:get(nonces, C) of
@ -314,7 +318,7 @@ stop_workers_for_seq(Seq, Workers) ->
stop_worker(#worker{pid = Pid} = W) when is_pid(Pid) -> stop_worker(#worker{pid = Pid} = W) when is_pid(Pid) ->
MRef = erlang:monitor(process, Pid), MRef = erlang:monitor(process, Pid),
?LOG_DEBUG("Will stop worker ~p (MRef = ~p)", [Pid, MRef]), ?LOG_DEBUG("Will stop worker ~p (MRef = ~p)", [Pid, MRef]),
exit(Pid, kill), exit(Pid, shutdown),
receive receive
{'EXIT', Pid, _} -> ok; {'EXIT', Pid, _} -> ok;
{'DOWN', MRef, process, Pid, _} -> ok {'DOWN', MRef, process, Pid, _} -> ok

View File

@ -4,7 +4,7 @@
{prefix,"gmhc"}. {prefix,"gmhc"}.
{author,"Ulf Wiger, QPQ AG"}. {author,"Ulf Wiger, QPQ AG"}.
{desc,"Gajumaru Hive Client"}. {desc,"Gajumaru Hive Client"}.
{package_id,{"uwiger","gmhive_client",{0,4,3}}}. {package_id,{"uwiger","gmhive_client",{0,4,5}}}.
{deps,[{"uwiger","gmcuckoo",{1,2,3}}, {deps,[{"uwiger","gmcuckoo",{1,2,3}},
{"uwiger","gmhive_worker",{0,3,0}}, {"uwiger","gmhive_worker",{0,3,0}},
{"otpr","eblake2",{1,0,1}}, {"otpr","eblake2",{1,0,1}},