]> git.ipfire.org Git - pakfire.git/commitdiff
job: Buffer log lines in a ring buffer
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 5 Oct 2024 13:30:34 +0000 (13:30 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 5 Oct 2024 13:30:34 +0000 (13:30 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/job.c

index c639a0ae6bb2d8d756172253cfe1d08ecfae8b19..2a377afa461887fb5506209b20acd4f534a98083 100644 (file)
 #include <pakfire/ctx.h>
 #include <pakfire/daemon.h>
 #include <pakfire/job.h>
+#include <pakfire/log_buffer.h>
 #include <pakfire/logging.h>
 #include <pakfire/string.h>
 #include <pakfire/util.h>
 
-#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;