]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
journal-file: fix archiving offline journals
authorVito Caputo <vcaputo@pengaru.com>
Sun, 29 Nov 2020 00:28:08 +0000 (16:28 -0800)
committerLennart Poettering <lennart@poettering.net>
Tue, 16 Feb 2021 22:09:41 +0000 (23:09 +0100)
The existing set_offline() short-circuit erroneously included
when f->archive was true and header->state was STATE_OFFLINE.

This commit makes the short-circuit f->archive aware, so it will
only catch scenarios where there's not an offlining in progress
and the header state matches the target state of either archived
or offline.

Fixes https://github.com/systemd/systemd/issues/17770

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

index cfa4657f8467102368ce405ff63694997acabc79..2545f1314bbeea335e23762427a5d77f9703695c 100644 (file)
@@ -208,6 +208,7 @@ static bool journal_file_set_offline_try_restart(JournalFile *f) {
  * context without involving another thread.
  */
 int journal_file_set_offline(JournalFile *f, bool wait) {
+        int target_state;
         bool restarted;
         int r;
 
@@ -219,9 +220,13 @@ int journal_file_set_offline(JournalFile *f, bool wait) {
         if (f->fd < 0 || !f->header)
                 return -EINVAL;
 
+        target_state = f->archive ? STATE_ARCHIVED : STATE_OFFLINE;
+
         /* An offlining journal is implicitly online and may modify f->header->state,
-         * we must also join any potentially lingering offline thread when not online. */
-        if (!journal_file_is_offlining(f) && f->header->state != STATE_ONLINE)
+         * we must also join any potentially lingering offline thread when already in
+         * the desired offline state.
+         */
+        if (!journal_file_is_offlining(f) && f->header->state == target_state)
                 return journal_file_set_offline_thread_join(f);
 
         /* Restart an in-flight offline thread and wait if needed, or join a lingering done one. */