static int pakfire_builder_submit_stats(sd_event_source* event, uint64_t usec, void* data) {
struct pakfire_builder* self = data;
+ struct pakfire_cpustat cpustat = {};
+ struct pakfire_loadavg loadavg = {};
+ struct pakfire_meminfo meminfo = {};
+ struct json_object* stats = NULL;
+ struct json_object* p = NULL;
int r;
// Log action
// Submit stats again soon...
r = pakfire_builder_schedule_stats(self, PAKFIRE_STATS_TIMER);
if (r < 0)
- return r;
+ goto ERROR;
- return 0;
+ // Fetch CPU stats
+ r = pakfire_cpustat(&cpustat);
+ if (r < 0) {
+ ERROR(self->ctx, "Failed to fetch CPU stats: %s\n", strerror(-r));
+ goto ERROR;
+ }
+
+ // Fetch load average
+ r = pakfire_loadavg(&loadavg);
+ if (r < 0) {
+ ERROR(self->ctx, "Failed to fetch load average: %s\n", strerror(-r));
+ goto ERROR;
+ }
+
+ // Fetch meminfo
+ r = pakfire_meminfo(&meminfo);
+ if (r < 0) {
+ ERROR(self->ctx, "Failed to fetch meminfo: %s\n", strerror(-r));
+ goto ERROR;
+ }
+
+ // Create new data object
+ r = pakfire_json_new_object(&p);
+ if (r < 0)
+ goto ERROR;
+
+ // CPU Stats: User
+ r = pakfire_json_add_double(p, "cpu_user", cpustat.user);
+ if (r < 0)
+ goto ERROR;
+
+ // CPU Stats: Nice
+ r = pakfire_json_add_double(p, "cpu_nice", cpustat.nice);
+ if (r < 0)
+ goto ERROR;
+
+ // CPU Stats: System
+ r = pakfire_json_add_double(p, "cpu_system", cpustat.system);
+ if (r < 0)
+ goto ERROR;
+
+ // CPU Stats: Idle
+ r = pakfire_json_add_double(p, "cpu_idle", cpustat.idle);
+ if (r < 0)
+ goto ERROR;
+
+ // CPU Stats: IO Wait
+ r = pakfire_json_add_double(p, "cpu_iowait", cpustat.iowait);
+ if (r < 0)
+ goto ERROR;
+
+ // CPU Stats: IRQ
+ r = pakfire_json_add_double(p, "cpu_irq", cpustat.irq);
+ if (r < 0)
+ goto ERROR;
+
+ // CPU Stats: Soft IRQ
+ r = pakfire_json_add_double(p, "cpu_softirq", cpustat.softirq);
+ if (r < 0)
+ goto ERROR;
+
+ // CPU Stats: Steal
+ r = pakfire_json_add_double(p, "cpu_steal", cpustat.steal);
+ if (r < 0)
+ goto ERROR;
+
+ // CPU Stats: Guest
+ r = pakfire_json_add_double(p, "cpu_guest", cpustat.guest);
+ if (r)
+ goto ERROR;
+
+ // CPU Stats: Guest Nice
+ r = pakfire_json_add_double(p, "cpu_guest_nice", cpustat.guest_nice);
+ if (r < 0)
+ goto ERROR;
+
+ // Load Average: 1
+ r = pakfire_json_add_double(p, "loadavg1", loadavg.load1);
+ if (r < 0)
+ goto ERROR;
+
+ // Load Average: 5
+ r = pakfire_json_add_double(p, "loadavg5", loadavg.load5);
+ if (r < 0)
+ goto ERROR;
+
+ // Load Average: 15
+ r = pakfire_json_add_double(p, "loadavg15", loadavg.load15);
+ if (r < 0)
+ goto ERROR;
+
+ // Memory: Total
+ r = pakfire_json_add_uint64(p, "mem_total", meminfo.total);
+ if (r < 0)
+ goto ERROR;
+
+ // Memory: Available
+ r = pakfire_json_add_uint64(p, "mem_available", meminfo.available);
+ if (r < 0)
+ goto ERROR;
+
+ // Memory: Used
+ r = pakfire_json_add_int64(p, "mem_used", meminfo.used);
+ if (r < 0)
+ goto ERROR;
+
+ // Memory: Free
+ r = pakfire_json_add_uint64(p, "mem_free", meminfo.free);
+ if (r < 0)
+ goto ERROR;
+
+ // Memory: Active
+ r = pakfire_json_add_uint64(p, "mem_active", meminfo.active);
+ if (r < 0)
+ goto ERROR;
+
+ // Memory: Inactive
+ r = pakfire_json_add_uint64(p, "mem_inactive", meminfo.inactive);
+ if (r < 0)
+ goto ERROR;
+
+ // Memory: Buffers
+ r = pakfire_json_add_uint64(p, "mem_buffers", meminfo.buffers);
+ if (r < 0)
+ goto ERROR;
+
+ // Memory: Cached
+ r = pakfire_json_add_uint64(p, "mem_cached", meminfo.cached);
+ if (r < 0)
+ goto ERROR;
+
+ // Memory: Shared
+ r = pakfire_json_add_uint64(p, "mem_shared", meminfo.shared);
+ if (r < 0)
+ goto ERROR;
+
+ // Swap: Total
+ r = pakfire_json_add_uint64(p, "swap_total", meminfo.swap_total);
+ if (r < 0)
+ goto ERROR;
+
+ // Swap: Used
+ r = pakfire_json_add_uint64(p, "swap_used", meminfo.swap_used);
+ if (r < 0)
+ goto ERROR;
+
+ // Swap: Free
+ r = pakfire_json_add_uint64(p, "swap_free", meminfo.swap_free);
+ if (r < 0)
+ goto ERROR;
+
+ // Create a new stats object
+ r = pakfire_json_new_object(&stats);
+ if (r < 0)
+ goto ERROR;
+
+ // Set type
+ r = pakfire_json_add_string(stats, "type", "stats");
+ if (r < 0)
+ goto ERROR;
+
+ // Set data
+ r = json_object_object_add(stats, "data", p);
+ if (r < 0)
+ goto ERROR;
+
+ // Dereference data so it won't be double-freed later
+ data = NULL;
+
+ // Send the message
+ r = pakfire_builder_send_message(self, stats);
+ if (r < 0) {
+ switch (-r) {
+ // Ignore if we are not connected
+ case ENOTCONN:
+ r = 0;
+ break;
+
+ // Raise anything else
+ default:
+ goto ERROR;
+ }
+ }
+
+ERROR:
+ if (stats)
+ json_object_put(stats);
+ if (p)
+ json_object_put(p);
+
+ return r;
}
int pakfire_builder_connected(struct pakfire_xfer* xfer, void* data) {
return sd_event_exit(sd_event_source_get_event(source), 0);
}
-#if 0
-static int pakfire_daemon_submit_stats(sd_event_source* s, uint64_t usec, void* p) {
- struct pakfire_daemon* daemon = p;
- struct pakfire_cpustat cpustat = {};
- struct pakfire_loadavg loadavg = {};
- struct pakfire_meminfo meminfo = {};
- struct json_object* stats = NULL;
- struct json_object* data = NULL;
- int r;
-
- // If we have any jobs running, we will submit our stats
- // every five seconds, otherwise 30 seconds is enough.
- uint64_t next = (daemon->running_jobs > 0) ? PAKFIRE_STATS_WHEN_BUSY : PAKFIRE_STATS_WHEN_IDLE;
-
- // Reset the timer
- r = sd_event_source_set_time_relative(daemon->stats_timer, next);
- if (r < 0) {
- ERROR(daemon->ctx, "Could not set the stat timer: %s\n", strerror(-r));
- return r;
- }
-
- // Don't do anything if we don't have a control connection
- if (!daemon->control) {
- DEBUG(daemon->ctx, "Won't send stats without a control connection\n");
- return 0;
- }
-
- DEBUG(daemon->ctx, "Submitting stats...\n");
-
- // Fetch CPU stats
- r = pakfire_cpustat(&cpustat);
- if (r) {
- ERROR(daemon->ctx, "Failed to fetch CPU stats: %s\n", strerror(-r));
- goto ERROR;
- }
-
- // Fetch load average
- r = pakfire_loadavg(&loadavg);
- if (r) {
- ERROR(daemon->ctx, "Failed to fetch load average: %s\n", strerror(-r));
- goto ERROR;
- }
-
- // Fetch meminfo
- r = pakfire_meminfo(&meminfo);
- if (r) {
- ERROR(daemon->ctx, "Failed to fetch meminfo: %s\n", strerror(-r));
- goto ERROR;
- }
-
- // Create new data object
- data = json_object_new_object();
- if (!data)
- goto ERROR;
-
- // CPU Stats: User
- r = pakfire_json_add_double(data, "cpu_user", cpustat.user);
- if (r)
- goto ERROR;
-
- // CPU Stats: Nice
- r = pakfire_json_add_double(data, "cpu_nice", cpustat.nice);
- if (r)
- goto ERROR;
-
- // CPU Stats: System
- r = pakfire_json_add_double(data, "cpu_system", cpustat.system);
- if (r)
- goto ERROR;
-
- // CPU Stats: Idle
- r = pakfire_json_add_double(data, "cpu_idle", cpustat.idle);
- if (r)
- goto ERROR;
-
- // CPU Stats: IO Wait
- r = pakfire_json_add_double(data, "cpu_iowait", cpustat.iowait);
- if (r)
- goto ERROR;
-
- // CPU Stats: IRQ
- r = pakfire_json_add_double(data, "cpu_irq", cpustat.irq);
- if (r)
- goto ERROR;
-
- // CPU Stats: Soft IRQ
- r = pakfire_json_add_double(data, "cpu_softirq", cpustat.softirq);
- if (r)
- goto ERROR;
-
- // CPU Stats: Steal
- r = pakfire_json_add_double(data, "cpu_steal", cpustat.steal);
- if (r)
- goto ERROR;
-
- // CPU Stats: Guest
- r = pakfire_json_add_double(data, "cpu_guest", cpustat.guest);
- if (r)
- goto ERROR;
-
- // CPU Stats: Guest Nice
- r = pakfire_json_add_double(data, "cpu_guest_nice", cpustat.guest_nice);
- if (r)
- goto ERROR;
-
- // Load Average: 1
- r = pakfire_json_add_double(data, "loadavg1", loadavg.load1);
- if (r)
- goto ERROR;
-
- // Load Average: 5
- r = pakfire_json_add_double(data, "loadavg5", loadavg.load5);
- if (r)
- goto ERROR;
-
- // Load Average: 15
- r = pakfire_json_add_double(data, "loadavg15", loadavg.load15);
- if (r)
- goto ERROR;
-
- // Memory: Total
- r = pakfire_json_add_uint64(data, "mem_total", meminfo.total);
- if (r)
- goto ERROR;
-
- // Memory: Available
- r = pakfire_json_add_uint64(data, "mem_available", meminfo.available);
- if (r)
- goto ERROR;
-
- // Memory: Used
- r = pakfire_json_add_int64(data, "mem_used", meminfo.used);
- if (r)
- goto ERROR;
-
- // Memory: Free
- r = pakfire_json_add_uint64(data, "mem_free", meminfo.free);
- if (r)
- goto ERROR;
-
- // Memory: Active
- r = pakfire_json_add_uint64(data, "mem_active", meminfo.active);
- if (r)
- goto ERROR;
-
- // Memory: Inactive
- r = pakfire_json_add_uint64(data, "mem_inactive", meminfo.inactive);
- if (r)
- goto ERROR;
-
- // Memory: Buffers
- r = pakfire_json_add_uint64(data, "mem_buffers", meminfo.buffers);
- if (r)
- goto ERROR;
-
- // Memory: Cached
- r = pakfire_json_add_uint64(data, "mem_cached", meminfo.cached);
- if (r)
- goto ERROR;
-
- // Memory: Shared
- r = pakfire_json_add_uint64(data, "mem_shared", meminfo.shared);
- if (r)
- goto ERROR;
-
- // Swap: Total
- r = pakfire_json_add_uint64(data, "swap_total", meminfo.swap_total);
- if (r)
- goto ERROR;
-
- // Swap: Used
- r = pakfire_json_add_uint64(data, "swap_used", meminfo.swap_used);
- if (r)
- goto ERROR;
-
- // Swap: Free
- r = pakfire_json_add_uint64(data, "swap_free", meminfo.swap_free);
- if (r)
- goto ERROR;
-
- // Create a new stats object
- stats = json_object_new_object();
- if (!stats) {
- r = -errno;
- goto ERROR;
- }
-
- // Set type
- r = pakfire_json_add_string(stats, "type", "stats");
- if (r)
- goto ERROR;
-
- // Set data
- r = json_object_object_add(stats, "data", data);
- if (r)
- goto ERROR;
-
- // Dereference data so it won't be double-freed later
- data = NULL;
-
- // Send the message
- r = pakfire_daemon_send_message(daemon, stats);
- if (r < 0) {
- switch (-r) {
- // Ignore if we are not connected
- case ENOTCONN:
- r = 0;
- break;
-
- // Raise anything else
- default:
- goto ERROR;
- }
- }
-
-ERROR:
- if (stats)
- json_object_put(stats);
- if (data)
- json_object_put(data);
-
- return r;
-}
-#endif
-
/*
* Prevents that the system can be shut down when there are jobs running...
*/