From 8dca4046238baf9d4ce65e7b1bad6e5c04fb66b0 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Wed, 25 Jun 2025 16:30:31 +0000 Subject: [PATCH] builder: Build scaffolding to submit stats regularly Signed-off-by: Michael Tremer --- src/pakfire/builder.c | 74 +++++++++++++++++++++++++++++++++++++++++++ src/pakfire/daemon.c | 4 --- 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/src/pakfire/builder.c b/src/pakfire/builder.c index 431d6534..05fd3600 100644 --- a/src/pakfire/builder.c +++ b/src/pakfire/builder.c @@ -29,6 +29,9 @@ #include #include +// Submit stats every 30 seconds +#define PAKFIRE_STATS_TIMER S_TO_US(30) + struct pakfire_builder { // Context struct pakfire_ctx* ctx; @@ -45,12 +48,17 @@ struct pakfire_builder { // Control Connection struct pakfire_xfer* control; + // Stats Timer + sd_event_source* stats_timer; + // Reconnect Timer & Holdoff Time sd_event_source* reconnect_timer; uint64_t reconnect_holdoff; }; static void pakfire_builder_free(struct pakfire_builder* self) { + if (self->stats_timer) + sd_event_source_unref(self->stats_timer); if (self->client) pakfire_client_unref(self->client); if (self->control) @@ -115,14 +123,73 @@ int pakfire_builder_connect(struct pakfire_builder* self) { return pakfire_client_builder_connect(self->client, self); } +/* + Stats +*/ + +static int pakfire_builder_submit_stats(sd_event_source* event, uint64_t usec, void* data); + +/* + Schedules submitting stats some time in the future... +*/ +static int pakfire_builder_schedule_stats(struct pakfire_builder* self, uint64_t usec) { + int r; + + // Create the stats timer if it has not been created, yet + if (!self->stats_timer) { + // Setup the stats timer + r = sd_event_add_time_relative(self->loop, &self->stats_timer, + CLOCK_MONOTONIC, 0, 0, pakfire_builder_submit_stats, self); + if (r < 0) { + ERROR(self->ctx, "Could not register the stats timer: %s\n", strerror(-r)); + return r; + } + } + + // (Re-)arm the timer + r = sd_event_source_set_enabled(self->stats_timer, SD_EVENT_ONESHOT); + if (r < 0) { + ERROR(self->ctx, "Could not activate the stat timer: %s\n", strerror(-r)); + return r; + } + + // Set the timer + r = sd_event_source_set_time_relative(self->stats_timer, usec); + if (r < 0) + return r; + + return 0; +} + +static int pakfire_builder_submit_stats(sd_event_source* event, uint64_t usec, void* data) { + struct pakfire_builder* self = data; + int r; + + // Log action + DEBUG(self->ctx, "Submitting stats...\n"); + + // Submit stats again soon... + r = pakfire_builder_schedule_stats(self, PAKFIRE_STATS_TIMER); + if (r < 0) + return r; + + return 0; +} + int pakfire_builder_connected(struct pakfire_xfer* xfer, void* data) { struct pakfire_builder* self = data; + int r; DEBUG(self->ctx, "Builder connected\n"); // Store a reference to the control connection self->control = pakfire_xfer_ref(xfer); + // Submit the stats as soon as possible + r = pakfire_builder_schedule_stats(self, 0); + if (r < 0) + return r; + return 0; } @@ -145,6 +212,13 @@ int pakfire_builder_close(struct pakfire_xfer* xfer, int code, void* data) { self->control = NULL; } + // Disable sending stats until we are connected + r = sd_event_source_set_enabled(self->stats_timer, SD_EVENT_OFF); + if (r < 0) { + ERROR(self->ctx, "Could not disable the stats timer: %s\n", strerror(-r)); + return r; + } + INFO(self->ctx, "Will attempt to reconnect in %lu second(s)\n", US_TO_S(self->reconnect_holdoff)); diff --git a/src/pakfire/daemon.c b/src/pakfire/daemon.c index 1a76442d..60ee1a9e 100644 --- a/src/pakfire/daemon.c +++ b/src/pakfire/daemon.c @@ -39,10 +39,6 @@ #include #include -// How often to submit stats? -#define PAKFIRE_STATS_WHEN_BUSY S_TO_US(15) -#define PAKFIRE_STATS_WHEN_IDLE S_TO_US(60) - #define MAX_JOBS 64 struct pakfire_daemon { -- 2.47.2