Merge pull request 'Report no_solution for all relevant nonces with repeats' (#14) from uw-repeats-reporting into master

Reviewed-on: #14
This commit is contained in:
Ulf Wiger 2025-09-27 23:27:56 +09:00
commit 408bd9fc18
15 changed files with 69 additions and 39 deletions

View File

@ -1,6 +1,6 @@
{application,gmhive_client, {application,gmhive_client,
[{description,"Gajumaru Hive Client"}, [{description,"Gajumaru Hive Client"},
{vsn,"0.6.0"}, {vsn,"0.6.1"},
{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

@ -1,6 +1,6 @@
%% -*- mode: erlang; erlang-indent-level: 4; indent-tabs-mode: nil -*- %% -*- mode: erlang; erlang-indent-level: 4; indent-tabs-mode: nil -*-
-module(gmhc_app). -module(gmhc_app).
-vsn("0.6.0"). -vsn("0.6.1").
-behaviour(application). -behaviour(application).

View File

@ -1,5 +1,5 @@
-module(gmhc_config). -module(gmhc_config).
-vsn("0.6.0"). -vsn("0.6.1").
-export([ load_config/0 -export([ load_config/0
, get_config/1 , get_config/1

View File

@ -1,5 +1,5 @@
-module(gmhc_config_schema). -module(gmhc_config_schema).
-vsn("0.6.0"). -vsn("0.6.1").
-export([ schema/0 -export([ schema/0
, to_json/0 ]). , to_json/0 ]).

View File

@ -1,5 +1,5 @@
-module(gmhc_connector). -module(gmhc_connector).
-vsn("0.6.0"). -vsn("0.6.1").
-behaviour(gen_server). -behaviour(gen_server).

View File

@ -1,5 +1,5 @@
-module(gmhc_connectors_sup). -module(gmhc_connectors_sup).
-vsn("0.6.0"). -vsn("0.6.1").
-behavior(supervisor). -behavior(supervisor).
-export([ start_link/0 -export([ start_link/0

View File

@ -1,5 +1,5 @@
-module(gmhc_counters). -module(gmhc_counters).
-vsn("0.6.0"). -vsn("0.6.1").
-export([ initialize/0 ]). -export([ initialize/0 ]).

View File

@ -1,5 +1,5 @@
-module(gmhc_eureka). -module(gmhc_eureka).
-vsn("0.6.0"). -vsn("0.6.1").
-export([get_pool_address/0]). -export([get_pool_address/0]).

View File

@ -1,5 +1,5 @@
-module(gmhc_events). -module(gmhc_events).
-vsn("0.6.0"). -vsn("0.6.1").
-export([subscribe/1, -export([subscribe/1,
ensure_subscribed/1, ensure_subscribed/1,

View File

@ -1,5 +1,5 @@
-module(gmhc_handler). -module(gmhc_handler).
-vsn("0.6.0"). -vsn("0.6.1").
-behavior(gen_server). -behavior(gen_server).
-export([ start_link/0 -export([ start_link/0
@ -12,6 +12,7 @@
]). ]).
-export([ call/1 -export([ call/1
, async_call/1
, notify/1 , notify/1
, pool_connected/2 , pool_connected/2
, from_pool/1 ]). , from_pool/1 ]).
@ -38,6 +39,13 @@ call(Req) ->
{error, Reason} {error, Reason}
end. end.
async_call(Req) ->
try gen_server:call(?MODULE, {async_call, Req}, ?CALL_TIMEOUT)
catch
exit:Reason ->
{error, Reason}
end.
notify(Msg) -> notify(Msg) ->
gen_server:cast(?MODULE, {notify, Msg}). gen_server:cast(?MODULE, {notify, Msg}).
@ -56,6 +64,8 @@ init([]) ->
handle_call({call, Req}, _From, #st{} = S) -> handle_call({call, Req}, _From, #st{} = S) ->
{reply, call_connector(Req), S}; {reply, call_connector(Req), S};
handle_call({async_call, Req}, _From, #st{} = S) ->
{reply, call_connector(Req, false), S};
handle_call(_Req, _From, S) -> handle_call(_Req, _From, S) ->
{reply, {error, unknown_method}, S}. {reply, {error, unknown_method}, S}.
@ -119,27 +129,39 @@ maybe_publish(_) ->
maybe_via(#{via := Via}, Info) -> maybe_via(#{via := Via}, Info) ->
Info#{via => Via}. Info#{via => Via}.
call_connector(Req0) -> call_connector(Req) ->
call_connector(Req, true).
call_connector(Req0, Wait) ->
{ViaId, Req} = maps:take(via, Req0), {ViaId, Req} = maps:take(via, Req0),
case gmhc_connector:whereis_id(ViaId) of case gmhc_connector:whereis_id(ViaId) of
undefined -> undefined ->
{error, no_connection}; {error, no_connection};
Pid when is_pid(Pid) -> Pid when is_pid(Pid) ->
Id = erlang:unique_integer(), Id = erlang:unique_integer(),
MRef = erlang:monitor(process, Pid), MRef = case Wait of
true -> erlang:monitor(process, Pid);
false -> none
end,
gmhc_connector:send(ViaId, #{call => Req#{ id => Id }}), gmhc_connector:send(ViaId, #{call => Req#{ id => Id }}),
receive case Wait of
{from_pool, #{reply := #{ id := Id, result := Result }}} -> true ->
erlang:demonitor(MRef), receive
Result; {from_pool, #{reply := #{ id := Id
{from_pool, #{error := #{ id := Id } = Error}} -> , result := Result }}} ->
erlang:demonitor(MRef), erlang:demonitor(MRef),
{error, maps:remove(id, Error)}; Result;
{'DOWN', MRef, _, _, _} -> {from_pool, #{error := #{ id := Id } = Error}} ->
{error, no_connection} erlang:demonitor(MRef),
after 5000 -> {error, maps:remove(id, Error)};
erlang:demonitor(MRef), {'DOWN', MRef, _, _, _} ->
{error, {timeout, process_info(self(), messages)}} {error, no_connection}
after 5000 ->
erlang:demonitor(MRef),
{error, {timeout, process_info(self(), messages)}}
end;
false ->
ok
end end
end. end.

View File

@ -1,5 +1,5 @@
-module(gmhc_server). -module(gmhc_server).
-vsn("0.6.0"). -vsn("0.6.1").
-behaviour(gen_server). -behaviour(gen_server).
@ -184,6 +184,9 @@ code_change(_FromVsn, S, _Extra) ->
report_solutions(Solutions, W, #st{} = S) when ?CONNECTED(S) -> report_solutions(Solutions, W, #st{} = S) when ?CONNECTED(S) ->
#{via := Via, seq := Seq} = W#worker.cand, #{via := Via, seq := Seq} = W#worker.cand,
Nonces = all_nonces(W),
[report_no_solution_(Via, Seq, N)
|| N <- Nonces, not lists:keymember(N, 1, Solutions)],
gmhc_handler:call( gmhc_handler:call(
#{via => Via, #{via => Via,
solutions => #{ seq => Seq solutions => #{ seq => Seq
@ -191,18 +194,23 @@ report_solutions(Solutions, W, #st{} = S) when ?CONNECTED(S) ->
, evidence => Evd } , evidence => Evd }
|| {Nonce, Evd} <- Solutions] }}). || {Nonce, Evd} <- Solutions] }}).
%% report_solution(Nonce, Solution, W, #st{connected = true}) -> report_no_solution(_Nonce, W, #st{} = S) when ?CONNECTED(S) ->
%% #{seq := Seq} = W#worker.cand,
%% gmhc_handler:call(#{solution => #{ seq => Seq
%% , nonce => Nonce
%% , evidence => Solution }}).
report_no_solution(Nonce, W, #st{} = S) when ?CONNECTED(S) ->
#{via := Via, seq := Seq} = W#worker.cand, #{via := Via, seq := Seq} = W#worker.cand,
Nonces = all_nonces(W),
%% ?LOG_DEBUG("report no_solution Seq = ~p, Nonce = ~p", [Seq, Nonce]), %% ?LOG_DEBUG("report no_solution Seq = ~p, Nonce = ~p", [Seq, Nonce]),
gmhc_handler:call(#{via => Via, [report_no_solution_(Via, Seq, Nonce1) || Nonce1 <- Nonces],
no_solution => #{ seq => Seq ok.
, nonce => Nonce}}).
report_no_solution_(Via, Seq, Nonce) ->
gmhc_handler:async_call(#{via => Via,
no_solution => #{ seq => Seq
, nonce => Nonce}}).
all_nonces(#worker{nonce = Nonce, config = Config}) ->
case gmhw_pow_cuckoo:repeats(Config) of
1 -> [Nonce];
Rs -> lists:seq(Nonce, Nonce + Rs - 1)
end.
maybe_request_nonces(#st{ candidate = #{via := Via, seq := Seq, nonces := Nonces} maybe_request_nonces(#st{ candidate = #{via := Via, seq := Seq, nonces := Nonces}
, nonces = N} = S) when ?CONNECTED(S) -> , nonces = N} = S) when ?CONNECTED(S) ->

View File

@ -1,6 +1,6 @@
%% -*- mode: erlang; erlang-indent-level: 4; indent-tabs-mode: nil -*- %% -*- mode: erlang; erlang-indent-level: 4; indent-tabs-mode: nil -*-
-module(gmhc_sup). -module(gmhc_sup).
-vsn("0.6.0"). -vsn("0.6.1").
-behaviour(supervisor). -behaviour(supervisor).

View File

@ -8,7 +8,7 @@
%%%------------------------------------------------------------------- %%%-------------------------------------------------------------------
-module(gmhc_workers). -module(gmhc_workers).
-vsn("0.6.0"). -vsn("0.6.1").
-export([ -export([
get_worker_configs/0 get_worker_configs/0

View File

@ -1,5 +1,5 @@
-module(gmhive_client). -module(gmhive_client).
-vsn("0.6.0"). -vsn("0.6.1").
-export([ connect/1 -export([ connect/1
, disconnect/1 , disconnect/1

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,6,0}}}. {package_id,{"uwiger","gmhive_client",{0,6,1}}}.
{deps,[{"uwiger","gmhive_worker",{0,5,1}}, {deps,[{"uwiger","gmhive_worker",{0,5,1}},
{"uwiger","gmcuckoo",{1,2,4}}, {"uwiger","gmcuckoo",{1,2,4}},
{"otpr","eblake2",{1,0,1}}, {"otpr","eblake2",{1,0,1}},