Pipe: Fix rare flushing of seldomly used buffers 67/84267/2
authorMichal Bloch <m.bloch@samsung.com>
Tue, 16 Aug 2016 16:20:26 +0000 (18:20 +0200)
committerMichal Bloch <m.bloch@samsung.com>
Thu, 18 Aug 2016 19:42:19 +0000 (21:42 +0200)
For any given buffer, if all other buffers combined receive messages more often than the time threshold (-t parameter),
the remaining buffer will only flush when the data threshold (-b parameter) is met regardless of time.
Both conditions are supposed to trigger a flush.

Change-Id: I522d2f09e788f9eb731f9e5e1039dcc1a0e64aac
Signed-off-by: Michal Bloch <m.bloch@samsung.com>
src/logger/logger_pipe.c

index 6328ab1..20c36f0 100644 (file)
@@ -147,7 +147,6 @@ struct log_buffer {
        int                head;
        int                tail;
        int                not_empty;
-       int                buffered_len;
        char               buffer[0];
 };
 
@@ -167,6 +166,7 @@ struct logger {
        struct writer*      writers;
        struct reader**     readers;
        struct log_buffer** buffers;
+       int                 buffered_len;
        int                 max_buffered_bytes;
        int                 max_buffered_time;
        log_format*         default_format;
@@ -361,7 +361,7 @@ static int buffer_free_space(struct log_buffer* b)
        return free_space;
 }
 
-static void buffer_append(const struct logger_entry* entry, struct log_buffer* b, struct reader* reader_head)
+static void buffer_append(struct logger* s, const struct logger_entry* entry, struct log_buffer* b, struct reader* reader_head)
 {
        while (buffer_free_space(b) <= entry->len) { // note that we use <= instead of < to make sure there's always some extra empty space. This guarantees that head != tail, which serves to disambiguate readers living there
                int old_head = b->head;
@@ -378,7 +378,7 @@ static void buffer_append(const struct logger_entry* entry, struct log_buffer* b
        copy_to_buffer(entry, b->tail, entry->len, b);
        b->tail += entry->len;
        b->tail %= b->size;
-       b->buffered_len += entry->len;
+       s->buffered_len += entry->len;
        b->not_empty = 1;
        ++b->lines;
 }
@@ -763,7 +763,7 @@ static int service_writer_handle_req_clear(struct logger* server, struct writer*
                return EINVAL;
 
        wr->buf_ptr->head = wr->buf_ptr->tail = wr->buf_ptr->not_empty = 0;
-       wr->buf_ptr->buffered_len = wr->buf_ptr->lines = 0;
+       wr->buf_ptr->lines = 0;
 
        LIST_FOREACH(server->readers[wr->buf_ptr->id], reader) {
                reader->current = 0;
@@ -879,7 +879,7 @@ static int service_writer_pipe(struct logger* server, struct writer* wr, struct
                while ((wr->readed >= sizeof(entry->len)) && (entry->len <= wr->readed)) {
                        if (entry->len < sizeof(struct logger_entry))
                                return EINVAL;
-                       buffer_append(entry, server->buffers[wr->buf_ptr->id], server->readers[wr->buf_ptr->id]);
+                       buffer_append(server, entry, server->buffers[wr->buf_ptr->id], server->readers[wr->buf_ptr->id]);
                        wr->readed -= entry->len;
                        memmove(wr->buffer, wr->buffer + entry->len, LOG_MAX_SIZE - entry->len);
                }
@@ -905,11 +905,10 @@ static void service_all_readers(struct logger* server, int force_push)
 {
        int i = 0;
        int r = 0;
-       struct log_buffer** buffers = server->buffers;
        struct reader* reader = NULL;
 
-       for (i = 0; i < LOG_ID_MAX; i++) {
-               if (force_push || buffers[i]->buffered_len >= server->max_buffered_bytes) {
+       if (force_push || server->buffered_len >= server->max_buffered_bytes) {
+               for (i = 0; i < LOG_ID_MAX; i++) {
                        LIST_FOREACH(server->readers[i], reader) {
                                r = service_reader(server, reader);
                                if (r > 0) {
@@ -919,9 +918,8 @@ static void service_all_readers(struct logger* server, int force_push)
                                                break;
                                }
                        }
-
-                       buffers[i]->buffered_len = 0;
                }
+               server->buffered_len = 0;
        }
 }