Recovery code documents clearly that a shutdown checkpoint is executed at
end of recovery - a shutdown checkpoint WAL record is written but the buffer
manager had been altered to treat end of recovery as a normal checkpoint.
This bug exacerbates the bufmgr relpersistence bug.
Bug spotted by Andres Freund, patch by me.
/*
* Unless this is a shutdown checkpoint, we write only permanent, dirty
- * buffers. But at shutdown time, we write all dirty buffers.
+ * buffers. But at shutdown or end of recovery, we write all dirty buffers.
*/
- if (!(flags & CHECKPOINT_IS_SHUTDOWN))
+ if (!((flags & CHECKPOINT_IS_SHUTDOWN) || (flags & CHECKPOINT_END_OF_RECOVERY)))
mask |= BM_PERMANENT;
/*