]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Revert "journal-file: truncate archived journals"
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 15 Jun 2021 06:29:55 +0000 (15:29 +0900)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 15 Jun 2021 13:50:36 +0000 (15:50 +0200)
This reverts commit 592d419ce6e283c443901be4a69c95984821ff06.

The commit makes journald unstable, and is just an optimization
for the size of journal. Hence, it is safe to revert the commit.

Fixes #19895.

src/libsystemd/sd-journal/journal-file.c

index ff2d23f480390845236a9ddd5d68eb46d2937016..64aa132c7a00c79648ff2877cdb847452f805886 100644 (file)
 #  pragma GCC diagnostic ignored "-Waddress-of-packed-member"
 #endif
 
-static int journal_file_tail_end(JournalFile *f, uint64_t *ret_offset) {
-        Object *tail;
-        uint64_t p;
-        int r;
-
-        assert(f);
-        assert(f->header);
-        assert(ret_offset);
-
-        p = le64toh(f->header->tail_object_offset);
-        if (p == 0)
-                p = le64toh(f->header->header_size);
-        else {
-                uint64_t sz;
-
-                r = journal_file_move_to_object(f, OBJECT_UNUSED, p, &tail);
-                if (r < 0)
-                        return r;
-
-                sz = le64toh(READ_NOW(tail->object.size));
-                if (sz > UINT64_MAX - sizeof(uint64_t) + 1)
-                        return -EBADMSG;
-
-                sz = ALIGN64(sz);
-                if (p > UINT64_MAX - sz)
-                        return -EBADMSG;
-
-                p += sz;
-        }
-
-        *ret_offset = p;
-
-        return 0;
-}
-
 /* This may be called from a separate thread to prevent blocking the caller for the duration of fsync().
  * As a result we use atomic operations on f->offline_state for inter-thread communications with
  * journal_file_set_offline() and journal_file_set_online(). */
@@ -157,25 +122,6 @@ static void journal_file_set_offline_internal(JournalFile *f) {
 
                         f->header->state = f->archive ? STATE_ARCHIVED : STATE_OFFLINE;
                         (void) fsync(f->fd);
-
-                        if (f->archive) {
-                                uint64_t p;
-                                int r;
-
-                                /* truncate excess from the end of archives */
-                                r = journal_file_tail_end(f, &p);
-                                if (r < 0)
-                                        log_debug_errno(r, "Failed to determine end of tail object, ignoring: %m");
-                                else {
-                                        /* arena_size can't exceed the file size, ensure it's updated before truncating */
-                                        f->header->arena_size = htole64(p - le64toh(f->header->header_size));
-
-                                        (void) fsync(f->fd);
-
-                                        if (ftruncate(f->fd, p) < 0)
-                                                log_debug_errno(errno, "Failed to truncate archive at end of tail object, ignoring: %m");
-                                }
-                        }
                         break;
 
                 case OFFLINE_OFFLINING:
@@ -1108,7 +1054,7 @@ int journal_file_append_object(
 
         int r;
         uint64_t p;
-        Object *o;
+        Object *tail, *o;
         void *t;
 
         assert(f);
@@ -1120,9 +1066,26 @@ int journal_file_append_object(
         if (r < 0)
                 return r;
 
-        r = journal_file_tail_end(f, &p);
-        if (r < 0)
-                return r;
+        p = le64toh(f->header->tail_object_offset);
+        if (p == 0)
+                p = le64toh(f->header->header_size);
+        else {
+                uint64_t sz;
+
+                r = journal_file_move_to_object(f, OBJECT_UNUSED, p, &tail);
+                if (r < 0)
+                        return r;
+
+                sz = le64toh(READ_NOW(tail->object.size));
+                if (sz > UINT64_MAX - sizeof(uint64_t) + 1)
+                        return -EBADMSG;
+
+                sz = ALIGN64(sz);
+                if (p > UINT64_MAX - sz)
+                        return -EBADMSG;
+
+                p += sz;
+        }
 
         r = journal_file_allocate(f, p, size);
         if (r < 0)