Avoid creating archive status ".ready" files too early WAL records may span multiple segments, but XLogWrite() does not wait for the entire record to be written out to disk before creating archive status files. Instead, as soon as the last WAL page of the segment is written, the archive status file is created, and the archiver may process it. If PostgreSQL crashes before it is able to write and flush the rest of the record (in the next WAL segment), the wrong version of the first segment file lingers in the archive, which causes operations such as point-in-time restores to fail.
To fix this, keep track of records that span across segments and ensure that segments are only marked ready-for-archival once such records have been completely written to disk. This has always been wrong, so backpatch all the way back. Author: Nathan Bossart <[email protected]> Reviewed-by: Kyotaro Horiguchi <[email protected]> Reviewed-by: Ryo Matsumura <[email protected]> Reviewed-by: Andrey Borodin <[email protected]> Discussion: https://postgr.es/m/[email protected] Branch ------ REL_12_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/5065aeafb0b7593c04d3bc5bc2a86037f32143fc Modified Files -------------- src/backend/access/transam/xlog.c | 216 +++++++++++++++++++++++++++++++++++-- src/backend/postmaster/walwriter.c | 7 ++ src/include/access/xlog.h | 1 + src/include/access/xlogdefs.h | 1 + 4 files changed, 215 insertions(+), 10 deletions(-)
