On Tue, Apr 3, 2018 at 05:47:01PM -0400, Robert Haas wrote:
> Well, in PostgreSQL, we have a background process called the
> checkpointer which is the process that normally does all of the
> fsync() calls but only a subset of the write() calls. The
> checkpointer does not, however, necessarily have every file open all
> the time, so these fixes aren't sufficient to make sure that the
> checkpointer ever sees an fsync() failure.
There has been a lot of focus in this thread on the workflow:
write() -> blocks remain in kernel memory -> fsync() -> panic?
But what happens in this workflow:
write() -> kernel syncs blocks to storage -> fsync()
Is fsync() going to see a "kernel syncs blocks to storage" failure?
There was already discussion that if the fsync() causes the "syncs
blocks to storage", fsync() will only report the failure once, but will
it see any failure in the second workflow? There is indication that a
failed write to storage reports back an error once and clears the dirty
flag, but do we know it keeps things around long enough to report an
error to a future fsync()?
You would think it does, but I have to ask since our fsync() assumptions
have been wrong for so long.
--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com
+ As you are, so once was I. As I am, so you will be. +
+ Ancient Roman grave inscription +