diff options
Diffstat (limited to 'src/journal')
-rw-r--r-- | src/journal/journal-file.c | 10 | ||||
-rw-r--r-- | src/journal/journal-file.h | 1 |
2 files changed, 9 insertions, 2 deletions
diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c index ff01e5aa94..35f4abab1d 100644 --- a/src/journal/journal-file.c +++ b/src/journal/journal-file.c @@ -120,7 +120,7 @@ static void journal_file_set_offline_internal(JournalFile *f) { if (!__sync_bool_compare_and_swap(&f->offline_state, OFFLINE_SYNCING, OFFLINE_OFFLINING)) continue; - f->header->state = STATE_OFFLINE; + f->header->state = f->archive ? STATE_ARCHIVED : STATE_OFFLINE; (void) fsync(f->fd); break; @@ -3177,7 +3177,13 @@ int journal_file_rotate(JournalFile **f, bool compress, bool seal, Set *deferred if (r < 0 && errno != ENOENT) return -errno; - old_file->header->state = STATE_ARCHIVED; + /* Set as archive so offlining commits w/state=STATE_ARCHIVED. + * Previously we would set old_file->header->state to STATE_ARCHIVED directly here, + * but journal_file_set_offline() short-circuits when state != STATE_ONLINE, which + * would result in the rotated journal never getting fsync() called before closing. + * Now we simply queue the archive state by setting an archive bit, leaving the state + * as STATE_ONLINE so proper offlining occurs. */ + old_file->archive = true; /* Currently, btrfs is not very good with out write patterns * and fragments heavily. Let's defrag our journal files when diff --git a/src/journal/journal-file.h b/src/journal/journal-file.h index a0ec8c284b..564e1a8179 100644 --- a/src/journal/journal-file.h +++ b/src/journal/journal-file.h @@ -86,6 +86,7 @@ typedef struct JournalFile { bool seal:1; bool defrag_on_close:1; bool close_fd:1; + bool archive:1; bool tail_entry_monotonic_valid:1; |