]> git.ipfire.org Git - pakfire.git/commitdiff
builder: Build scaffolding to submit stats regularly
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 25 Jun 2025 16:30:31 +0000 (16:30 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 25 Jun 2025 16:31:56 +0000 (16:31 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/builder.c
src/pakfire/daemon.c

index 431d6534f49aef8ec25d8a3d4a6faa24e4979c31..05fd360056148ae31228e437edb09d9a8674fbda 100644 (file)
@@ -29,6 +29,9 @@
 #include <pakfire/util.h>
 #include <pakfire/xfer.h>
 
+// 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));
 
index 1a76442dc74ea966ce734a82c610f93f81646301..60ee1a9e0a657e832c7a476bc532087775c2113c 100644 (file)
 #include <pakfire/string.h>
 #include <pakfire/util.h>
 
-// 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 {