From 07b658d509b1c037facb916a33fc7a44b9f5aab0 Mon Sep 17 00:00:00 2001 From: Ulf Wiger Date: Tue, 23 Sep 2025 16:44:46 +0200 Subject: [PATCH] Configurable progress reporting --- ebin/gmhive_client.app | 2 +- src/gmhc_app.erl | 11 +++- src/gmhc_config.erl | 2 +- src/gmhc_config_schema.erl | 5 +- src/gmhc_connector.erl | 2 +- src/gmhc_connectors_sup.erl | 2 +- src/gmhc_counters.erl | 2 +- src/gmhc_eureka.erl | 2 +- src/gmhc_events.erl | 121 +++++++++++++++++++++++++++++++----- src/gmhc_handler.erl | 2 +- src/gmhc_server.erl | 2 +- src/gmhc_sup.erl | 2 +- src/gmhc_workers.erl | 2 +- src/gmhive_client.erl | 2 +- zomp.meta | 4 +- 15 files changed, 131 insertions(+), 32 deletions(-) diff --git a/ebin/gmhive_client.app b/ebin/gmhive_client.app index cc0bafa..ca863fe 100644 --- a/ebin/gmhive_client.app +++ b/ebin/gmhive_client.app @@ -1,6 +1,6 @@ {application,gmhive_client, [{description,"Gajumaru Hive Client"}, - {vsn,"0.5.1"}, + {vsn,"0.6.0"}, {registered,[]}, {applications,[kernel,stdlib,sasl,gproc,inets,ssl,enoise, gmconfig,gmhive_protocol,gmhive_worker]}, diff --git a/src/gmhc_app.erl b/src/gmhc_app.erl index 9f3724e..7aaae11 100644 --- a/src/gmhc_app.erl +++ b/src/gmhc_app.erl @@ -1,6 +1,6 @@ %% -*- mode: erlang; erlang-indent-level: 4; indent-tabs-mode: nil -*- -module(gmhc_app). --vsn("0.4.8"). +-vsn("0.6.0"). -behaviour(application). @@ -49,4 +49,13 @@ set_things_up() -> gmhc_config:load_config(), logger:set_module_level([gmhw_pow_cuckoo], notice), ?LOG_DEBUG("Config: ~p", [gmconfig:user_config()]), + case gmhc_config:get_config([<<"report">>]) of + <<"debug">> -> + ?LOG_NOTICE("Starting debug reporter", []), + gmhc_events:debug(); + <<"progress">> -> + ?LOG_NOTICE("Starting progress reporter", []), + gmhc_events:progress(); + _ -> ok + end, ok. diff --git a/src/gmhc_config.erl b/src/gmhc_config.erl index b4ccd36..b9ff45b 100644 --- a/src/gmhc_config.erl +++ b/src/gmhc_config.erl @@ -1,5 +1,5 @@ -module(gmhc_config). --vsn("0.4.8"). +-vsn("0.6.0"). -export([ load_config/0 , get_config/1 diff --git a/src/gmhc_config_schema.erl b/src/gmhc_config_schema.erl index 76bdc59..5f953ac 100644 --- a/src/gmhc_config_schema.erl +++ b/src/gmhc_config_schema.erl @@ -1,5 +1,5 @@ -module(gmhc_config_schema). --vsn("0.4.8"). +-vsn("0.6.0"). -export([ schema/0 , to_json/0 ]). @@ -39,6 +39,9 @@ schema() -> , pool => pool() , pool_admin => pool_admin() , workers => workers() + , report => str(#{ enum => [<<"debug">>, <<"progress">>, <<"silent">>] + , default => <<"silent">> + , description => <<"Progress reporting">> }) }). pool() -> diff --git a/src/gmhc_connector.erl b/src/gmhc_connector.erl index 27b6238..8350f67 100644 --- a/src/gmhc_connector.erl +++ b/src/gmhc_connector.erl @@ -1,5 +1,5 @@ -module(gmhc_connector). --vsn("0.4.8"). +-vsn("0.6.0"). -behaviour(gen_server). diff --git a/src/gmhc_connectors_sup.erl b/src/gmhc_connectors_sup.erl index 9dea7c5..f1dd906 100644 --- a/src/gmhc_connectors_sup.erl +++ b/src/gmhc_connectors_sup.erl @@ -1,5 +1,5 @@ -module(gmhc_connectors_sup). --vsn("0.4.8"). +-vsn("0.6.0"). -behavior(supervisor). -export([ start_link/0 diff --git a/src/gmhc_counters.erl b/src/gmhc_counters.erl index 3b42158..03741ff 100644 --- a/src/gmhc_counters.erl +++ b/src/gmhc_counters.erl @@ -1,5 +1,5 @@ -module(gmhc_counters). --vsn("0.4.8"). +-vsn("0.6.0"). -export([ initialize/0 ]). diff --git a/src/gmhc_eureka.erl b/src/gmhc_eureka.erl index 2eb678e..828ce4b 100644 --- a/src/gmhc_eureka.erl +++ b/src/gmhc_eureka.erl @@ -1,5 +1,5 @@ -module(gmhc_eureka). --vsn("0.4.8"). +-vsn("0.6.0"). -export([get_pool_address/0]). diff --git a/src/gmhc_events.erl b/src/gmhc_events.erl index 64e2183..03da211 100644 --- a/src/gmhc_events.erl +++ b/src/gmhc_events.erl @@ -1,5 +1,5 @@ -module(gmhc_events). --vsn("0.4.8"). +-vsn("0.6.0"). -export([subscribe/1, ensure_subscribed/1, @@ -7,7 +7,17 @@ ensure_unsubscribed/1, publish/2]). --export([debug/0]). +-export([debug/0, + progress/0, + stop/0]). + +-export([rpt_debug/2, + rpt_progress/2]). + +%% internal +-export([init_reporter/2]). + +-include_lib("kernel/include/logger.hrl"). -export_type([event/0]). @@ -60,23 +70,100 @@ ensure_unsubscribed(Event) -> debug() -> ok = application:ensure_started(gproc), - spawn(fun() -> - subscribe(pool_notification), - subscribe({pool_notification, new_generation}), - subscribe(connected), - subscribe(puzzle), - subscribe(result), - subscribe(error), - subscribe(disconnected), - gmhive_worker:subscribe_returns(), - loop() - end). + spawn_reporter(fun() -> + sub(), + gmhive_worker:subscribe_returns(), + loop(fun rpt_debug/2, false) + end). -loop() -> +progress() -> + ok = application:ensure_started(gproc), + spawn_reporter(fun() -> + sub(), + loop(fun rpt_progress/2, true) + end). + +spawn_reporter(F) -> + Parent = self(), + proc_lib:start_link(?MODULE, init_reporter, [F, Parent]). + +init_reporter(F, Parent) -> + try_register_reporter(), + proc_lib:init_ack(Parent, self()), + F(). + +stop() -> + case whereis(gmhc_reporter) of + undefined -> + not_running; + Pid -> + exit(Pid, kill) + end. + +sub() -> + subscribe(pool_notification), + subscribe({pool_notification, new_generation}), + subscribe(connected), + subscribe(puzzle), + subscribe(result), + subscribe(error), + subscribe(disconnected). + +loop(F, Ts) -> receive stop -> ok; {gproc_ps_event, E, Data} -> - io:fwrite("EVENT ~p: ~p~n", [E, Data]), - loop() + maybe_print(F(E, Data), Ts), + loop(F, Ts) end. - + +try_register_reporter() -> + try register(gmhc_reporter, self()) + catch + error:_ -> + ?LOG_ERROR("Reporter already running. Try gmhc_events:stop().", []), + error(already_running) + end. + +maybe_print([], _) -> + ok; +maybe_print(String, Ts) when is_boolean(Ts) -> + TSstr = [[ts(), " "] || Ts], + io:put_chars([TSstr, String, "\n"]). + +ts() -> + calendar:system_time_to_rfc3339(erlang:system_time(millisecond), + [{unit, millisecond}, {offset, "Z"}]). + +rpt_debug(E, Data) -> + io_lib:fwrite("EVENT ~p: ~p", [E, Data]). + +rpt_progress(puzzle, #{info := {_Data, _Target, Nonce, _Config}}) -> + w("Trying nonce: ~p", [Nonce]); +rpt_progress(result, #{info := Info}) -> + case Info of + {error, no_solution} -> + []; + {ok, Cycles} -> + w("Found! Reporting ~w cycles to leader.", [length(Cycles)]); + Other -> + w("Unexpected 'result': ~tp", [Other]) + end; +rpt_progress(pool_notification, #{info := #{msg := Msg}}) -> + case Msg of + #{solution_accepted := #{seq := Seq}} -> + w("The hive has produced a solution! Sequence: ~w", [Seq]); + #{new_generation := _} -> []; + #{candidate := _} -> []; + Other -> + w("Unexpected 'pool_notification': ~tp", [Other]) + end; +rpt_progress(connected, _) -> + w("Connected!", []); +rpt_progress(disconnected, _) -> + w("Disconnected!", []); +rpt_progress(_, _) -> + []. + +w(Fmt, Args) -> + io_lib:fwrite(Fmt, Args). diff --git a/src/gmhc_handler.erl b/src/gmhc_handler.erl index 6c5f84c..0f8cc85 100644 --- a/src/gmhc_handler.erl +++ b/src/gmhc_handler.erl @@ -1,5 +1,5 @@ -module(gmhc_handler). --vsn("0.4.8"). +-vsn("0.6.0"). -behavior(gen_server). -export([ start_link/0 diff --git a/src/gmhc_server.erl b/src/gmhc_server.erl index adae85d..dd16f1d 100644 --- a/src/gmhc_server.erl +++ b/src/gmhc_server.erl @@ -1,5 +1,5 @@ -module(gmhc_server). --vsn("0.4.8"). +-vsn("0.6.0"). -behaviour(gen_server). diff --git a/src/gmhc_sup.erl b/src/gmhc_sup.erl index cd3970b..9027677 100644 --- a/src/gmhc_sup.erl +++ b/src/gmhc_sup.erl @@ -1,6 +1,6 @@ %% -*- mode: erlang; erlang-indent-level: 4; indent-tabs-mode: nil -*- -module(gmhc_sup). --vsn("0.4.8"). +-vsn("0.6.0"). -behaviour(supervisor). diff --git a/src/gmhc_workers.erl b/src/gmhc_workers.erl index a467f2c..bf25c4d 100644 --- a/src/gmhc_workers.erl +++ b/src/gmhc_workers.erl @@ -8,7 +8,7 @@ %%%------------------------------------------------------------------- -module(gmhc_workers). --vsn("0.4.8"). +-vsn("0.6.0"). -export([ get_worker_configs/0 diff --git a/src/gmhive_client.erl b/src/gmhive_client.erl index 28ef5c7..2b10d70 100644 --- a/src/gmhive_client.erl +++ b/src/gmhive_client.erl @@ -1,5 +1,5 @@ -module(gmhive_client). --vsn("0.4.8"). +-vsn("0.6.0"). -export([ connect/1 , disconnect/1 diff --git a/zomp.meta b/zomp.meta index 4f8c8bd..805ecab 100644 --- a/zomp.meta +++ b/zomp.meta @@ -2,9 +2,9 @@ {type,app}. {modules,[]}. {prefix,"gmhc"}. -{desc,"Gajumaru Hive Client"}. {author,"Ulf Wiger, QPQ AG"}. -{package_id,{"uwiger","gmhive_client",{0,5,1}}}. +{desc,"Gajumaru Hive Client"}. +{package_id,{"uwiger","gmhive_client",{0,6,0}}}. {deps,[{"uwiger","gmhive_worker",{0,5,1}}, {"uwiger","gmcuckoo",{1,2,4}}, {"otpr","eblake2",{1,0,1}},