journal: defer journal closes on rotate
authorVito Caputo <vito.caputo@coreos.com>
Thu, 18 Feb 2016 01:37:10 +0000 (17:37 -0800)
committerVito Caputo <vito.caputo@coreos.com>
Sat, 20 Feb 2016 02:50:20 +0000 (18:50 -0800)
commitb58c888f30947b29730768c48ad402a2c5b65be9
tree07c83055898fa1734f2f76409732ac73c0ecbb6e
parentac2e41f5103ce2c679089c4f8fb6be61d7caec07
journal: defer journal closes on rotate

When we rotate journals, we must set offline and close the current one,
but don't generally need to wait for this to complete.

Instead, we'll initiate an asynchronous offline via
journal_file_set_offline(oldfile, false), and add the file to a
per-server set of deferred closes to be closed later when they
won't block.

There's one complication however; journal_file_open() via
journal_file_verify_header() assumes that any writable journal in the
online state is the product of an unclean shutdown or other form of
corruption.

Thus there's a need for journal_file_open() to be aware of deferred
closes and synchronize with their completion when opening preexisting
journals for writing.  To facilitate this the deferred closes set is
supplied to the journal_file_open() function where the deferred closes
may be closed synchronously before verifying the header in such
circumstances.
12 files changed:
src/journal-remote/journal-remote-write.c
src/journal-remote/journal-remote.c
src/journal/journal-file.c
src/journal/journal-file.h
src/journal/journald-server.c
src/journal/journald-server.h
src/journal/sd-journal.c
src/journal/test-journal-flush.c
src/journal/test-journal-interleaving.c
src/journal/test-journal-stream.c
src/journal/test-journal-verify.c
src/journal/test-journal.c