]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/journal-remote/journal-remote-write.c
tree-wide: use mfree more
[thirdparty/systemd.git] / src / journal-remote / journal-remote-write.c
index 4d142bdc97bbb7003047a48531e362836246dfdf..8729372aa391ec3577adc73c7d581663fbad2d4c 100644 (file)
@@ -1,5 +1,3 @@
-/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
-
 /***
   This file is part of systemd.
 
@@ -19,7 +17,8 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include "journal-remote-write.h"
+#include "alloc-util.h"
+#include "journal-remote.h"
 
 int iovw_put(struct iovec_wrapper *iovw, void* data, size_t len) {
         if (!GREEDY_REALLOC(iovw->iovec, iovw->size_bytes, iovw->count + 1))
@@ -30,95 +29,136 @@ int iovw_put(struct iovec_wrapper *iovw, void* data, size_t len) {
 }
 
 void iovw_free_contents(struct iovec_wrapper *iovw) {
-        for (size_t j = 0; j < iovw->count; j++)
-                free(iovw->iovec[j].iov_base);
-        free(iovw->iovec);
-        iovw->iovec = NULL;
+        iovw->iovec = mfree(iovw->iovec);
         iovw->size_bytes = iovw->count = 0;
 }
 
 size_t iovw_size(struct iovec_wrapper *iovw) {
         size_t n = 0, i;
 
-        for(i = 0; i < iovw->count; i++)
+        for (i = 0; i < iovw->count; i++)
                 n += iovw->iovec[i].iov_len;
 
         return n;
 }
 
+void iovw_rebase(struct iovec_wrapper *iovw, char *old, char *new) {
+        size_t i;
+
+        for (i = 0; i < iovw->count; i++)
+                iovw->iovec[i].iov_base = (char*) iovw->iovec[i].iov_base - old + new;
+}
+
 /**********************************************************************
  **********************************************************************
  **********************************************************************/
 
 static int do_rotate(JournalFile **f, bool compress, bool seal) {
-        int r = journal_file_rotate(f, compress, seal);
+        int r = journal_file_rotate(f, compress, seal, NULL);
         if (r < 0) {
                 if (*f)
-                        log_error("Failed to rotate %s: %s", (*f)->path,
-                                  strerror(-r));
+                        log_error_errno(r, "Failed to rotate %s: %m", (*f)->path);
                 else
-                        log_error("Failed to create rotated journal: %s",
-                                  strerror(-r));
+                        log_error_errno(r, "Failed to create rotated journal: %m");
         }
 
         return r;
 }
 
-int writer_init(Writer *s) {
-        assert(s);
+Writer* writer_new(RemoteServer *server) {
+        Writer *w;
 
-        s->journal = NULL;
+        w = new0(Writer, 1);
+        if (!w)
+                return NULL;
 
-        memset(&s->metrics, 0xFF, sizeof(s->metrics));
+        memset(&w->metrics, 0xFF, sizeof(w->metrics));
 
-        s->mmap = mmap_cache_new();
-        if (!s->mmap)
-                return log_oom();
+        w->mmap = mmap_cache_new();
+        if (!w->mmap)
+                return mfree(w);
 
-        s->seqnum = 0;
+        w->n_ref = 1;
+        w->server = server;
 
-        return 0;
+        return w;
 }
 
-int writer_close(Writer *s) {
-        if (s->journal)
-                journal_file_close(s->journal);
-        if (s->mmap)
-                mmap_cache_unref(s->mmap);
-        return 0;
+Writer* writer_free(Writer *w) {
+        if (!w)
+                return NULL;
+
+        if (w->journal) {
+                log_debug("Closing journal file %s.", w->journal->path);
+                journal_file_close(w->journal);
+        }
+
+        if (w->server && w->hashmap_key)
+                hashmap_remove(w->server->writers, w->hashmap_key);
+
+        free(w->hashmap_key);
+
+        if (w->mmap)
+                mmap_cache_unref(w->mmap);
+
+        return mfree(w);
+}
+
+Writer* writer_unref(Writer *w) {
+        if (w && (-- w->n_ref <= 0))
+                writer_free(w);
+
+        return NULL;
 }
 
-int writer_write(Writer *s,
+Writer* writer_ref(Writer *w) {
+        if (w)
+                assert_se(++ w->n_ref >= 2);
+
+        return w;
+}
+
+int writer_write(Writer *w,
                  struct iovec_wrapper *iovw,
                  dual_timestamp *ts,
                  bool compress,
                  bool seal) {
         int r;
 
-        assert(s);
+        assert(w);
         assert(iovw);
         assert(iovw->count > 0);
 
-        if (journal_file_rotate_suggested(s->journal, 0)) {
+        if (journal_file_rotate_suggested(w->journal, 0)) {
                 log_info("%s: Journal header limits reached or header out-of-date, rotating",
-                         s->journal->path);
-                r = do_rotate(&s->journal, compress, seal);
+                         w->journal->path);
+                r = do_rotate(&w->journal, compress, seal);
                 if (r < 0)
                         return r;
         }
 
-        r = journal_file_append_entry(s->journal, ts, iovw->iovec, iovw->count,
-                                      &s->seqnum, NULL, NULL);
-        if (r >= 0)
+        r = journal_file_append_entry(w->journal, ts, iovw->iovec, iovw->count,
+                                      &w->seqnum, NULL, NULL);
+        if (r >= 0) {
+                if (w->server)
+                        w->server->event_count += 1;
                 return 1;
+        }
 
-        log_info("%s: Write failed, rotating", s->journal->path);
-        r = do_rotate(&s->journal, compress, seal);
+        log_debug_errno(r, "%s: Write failed, rotating: %m", w->journal->path);
+        r = do_rotate(&w->journal, compress, seal);
         if (r < 0)
                 return r;
+        else
+                log_debug("%s: Successfully rotated journal", w->journal->path);
 
         log_debug("Retrying write.");
-        r = journal_file_append_entry(s->journal, ts, iovw->iovec, iovw->count,
-                                      &s->seqnum, NULL, NULL);
-        return r < 0 ? r : 1;
+        r = journal_file_append_entry(w->journal, ts, iovw->iovec, iovw->count,
+                                      &w->seqnum, NULL, NULL);
+        if (r < 0)
+                return r;
+
+        if (w->server)
+                w->server->event_count += 1;
+        return 1;
 }