#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;
// 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)
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;
}
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));