From 441b8f4fec5e99e0e6c5158889d3d1ea6a9baca3 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 5 Oct 2024 13:30:34 +0000 Subject: [PATCH] job: Buffer log lines in a ring buffer Signed-off-by: Michael Tremer --- src/libpakfire/job.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/libpakfire/job.c b/src/libpakfire/job.c index c639a0ae6..2a377afa4 100644 --- a/src/libpakfire/job.c +++ b/src/libpakfire/job.c @@ -35,20 +35,15 @@ #include #include #include +#include #include #include #include -#define MAX_LINES 256 - struct log { FILE* f; int fds[2]; sd_event_source* event; - - // Buffer any read lines - char* lines[MAX_LINES]; - unsigned int num_lines; }; struct pakfire_job { @@ -90,6 +85,8 @@ struct pakfire_job { struct { struct log stdout; struct log stderr; + + struct pakfire_log_buffer* buffer; } log; // Events for reading logs from the child process @@ -238,6 +235,8 @@ static int pakfire_parse_job(struct pakfire_job* job, json_object* data) { static void pakfire_job_free(struct pakfire_job* job) { // Logging + if (job->log.buffer) + pakfire_log_buffer_unref(job->log.buffer); if (job->log.stdout.event) sd_event_source_unref(job->log.stdout.event); if (job->log.stderr.event) @@ -290,18 +289,30 @@ int pakfire_job_exited(sd_event_source* s, const siginfo_t* si, void* data) { static int __pakfire_job_log_forward(struct pakfire_job* job, int priority, uint32_t events, struct log* log) { char* line = NULL; + ssize_t length = 0; size_t l = 0; int r; // Read all lines if (events & EPOLLIN) { for (;;) { - r = getline(&line, &l, log->f); - if (r < 0) + length = getline(&line, &l, log->f); + if (length < 0) break; - // XXX TODO - printf("LINE %s\n", line); + // Enqueue the line in the log buffer + r = pakfire_log_buffer_enqueue(job->log.buffer, priority, line, length); + if (r < 0) { + switch (-r) { + case ENOSPC: + CTX_DEBUG(job->ctx, "Log buffer is full\n"); + break; + + default: + CTX_ERROR(job->ctx, "Could not enqueue to the log buffer: %s\n", strerror(-r)); + return r; + } + } } } @@ -713,6 +724,11 @@ int pakfire_job_create(struct pakfire_job** job, struct pakfire_ctx* ctx, // Initialize the PID file descriptor j->pidfd = -1; + // Allocate the log buffer + r = pakfire_log_buffer_create(&j->log.buffer, j->ctx, 1024); + if (r < 0) + goto ERROR; + // Setup the log pipe j->log.stdout.fds[0] = -1; j->log.stdout.fds[1] = -1; -- 2.47.2