dlog_logger: multiplex pipe storage readers (nominally) 77/291277/1
authorMichal Bloch <m.bloch@samsung.com>
Wed, 29 Mar 2023 12:28:12 +0000 (14:28 +0200)
committerMichal Bloch <m.bloch@samsung.com>
Fri, 31 Mar 2023 19:23:39 +0000 (21:23 +0200)
There's still just one storage reader per pipe reader,
but it's now easy to add more.

Change-Id: I58b677dc0b1989c635207d345540bfad94a2dec2
Signed-off-by: Michal Bloch <m.bloch@samsung.com>
src/logger/logger.c
src/logger/reader_pipe.c
src/logger/reader_pipe.h
src/tests/logger.c

index 1d0ef1d..cc06216 100644 (file)
@@ -129,10 +129,10 @@ int add_buffer_reader(struct log_buffer *buffer, struct reader_pipe *reader)
        assert(reader);
        assert(buffer);
 
-       reader->log_storage_reader_ptr = log_storage_new_reader(buffer->log_storage_ptr,
+       reader->log_storage_reader_ptrs[0] = log_storage_new_reader(buffer->log_storage_ptr,
                        reader->is_dumping, reader->monitor, reader_pipe_notify_losing_log, reader);
 
-       if (!reader->log_storage_reader_ptr)
+       if (!reader->log_storage_reader_ptrs[0])
                return -ENOMEM;
 
        return list_add(&reader->common.server->readers, reader) ? 0 : -ENOMEM;
index 52011ad..bcd0f59 100644 (file)
@@ -8,8 +8,13 @@ static void reader_pipe_free(struct reader_common *_reader)
 
        if (reader->common.server)
                list_remove(&reader->common.server->readers, reader);
-       if (reader->log_storage_reader_ptr)
-               log_storage_release_reader(reader->log_storage_reader_ptr);
+
+       for (log_id_t i = 0; i < NELEMS(reader->log_storage_reader_ptrs); ++i) {
+               log_storage_reader *const lsr = reader->log_storage_reader_ptrs[i];
+               if (!lsr)
+                       continue;
+               log_storage_release_reader(lsr);
+       }
 }
 
 static int print_out_logs(struct reader_common *_reader, struct now_t _time);
@@ -27,7 +32,9 @@ static struct reader_pipe *reader_pipe_alloc(struct logger *server, bool monitor
        ret->monitor = monitor;
        ret->is_dumping = is_dumping;
        ret->buf_ptr = NULL;
-       ret->log_storage_reader_ptr = NULL;
+
+       for (log_id_t i = 0; i < NELEMS(ret->log_storage_reader_ptrs); ++i)
+               ret->log_storage_reader_ptrs[i] = NULL;
 
        return ret;
 }
@@ -107,10 +114,33 @@ static int print_out_logs(struct reader_common *_reader, struct now_t _time)
        if (r < 0)
                return 0;
 
-       while (log_storage_reader_is_new_entry_available(reader->log_storage_reader_ptr)) {
-               const dlogutil_entry_s *ple = (const dlogutil_entry_s *)log_storage_reader_get_new_entry(reader->log_storage_reader_ptr);
+       while (true) {
+               log_storage_reader *best_lsr = NULL;
+               const dlogutil_entry_s *best_entry = NULL;
+               for (log_id_t i = 0; i < NELEMS(reader->log_storage_reader_ptrs); ++i) {
+                       log_storage_reader *const lsr = reader->log_storage_reader_ptrs[i];
+                       if (!lsr)
+                               continue;
+                       if (!log_storage_reader_is_new_entry_available(lsr))
+                               continue;
+
+                       const dlogutil_entry_s *const entry = log_storage_reader_peek_entry(lsr);
+                       assert(entry);
+
+                       if (!best_entry || log_entry_is_earlier(reader->buf_ptr->sort_by, entry, best_entry)) {
+                               best_lsr = lsr;
+                               best_entry = entry;
+                               continue;
+                       }
+               }
+
+               if (!best_lsr)
+                       break;
+
+               const dlogutil_entry_s *ple = (const dlogutil_entry_s *)log_storage_reader_get_new_entry(best_lsr);
 
                assert(ple);
+               assert(ple == best_entry);
 
                switch (reader_pipe_print_out_single_log(reader, ple)) {
                case 0: /* nothing more to do, let's do next loop */
index 289762b..e45b817 100644 (file)
@@ -12,7 +12,7 @@ struct buf_params;
 struct reader_pipe {
        struct reader_common common;
        struct log_buffer *buf_ptr;
-       log_storage_reader *log_storage_reader_ptr;
+       log_storage_reader *log_storage_reader_ptrs[LOG_ID_MAX];
        bool is_dumping;
        bool monitor;
 };
index 2b69c9d..b7bdc40 100644 (file)
@@ -814,7 +814,7 @@ int main(void)
 
        new_reader_fail = false;
        assert(add_buffer_reader(&buffer, &reader4) == 0);
-       assert(reader4.log_storage_reader_ptr == (struct log_storage_reader *)0x600D);
+       assert(reader4.log_storage_reader_ptrs[0] == (struct log_storage_reader *)0x600D);
 
        fcntl_correct = 0;
 }