Avoid deleting critical WAL segments during pg_rewind
authorÁlvaro Herrera <[email protected]>
Fri, 15 Nov 2024 11:53:12 +0000 (12:53 +0100)
committerÁlvaro Herrera <[email protected]>
Fri, 15 Nov 2024 11:53:12 +0000 (12:53 +0100)
commit90bcc7c2db1d346e1153748e627c2f922b67eae7
treeaac69ee331e9278a7c95976be781c0df6f0c4557
parentd31bbfb6590e586f731345960311861d5eb4c23f
Avoid deleting critical WAL segments during pg_rewind

Previously, in unlucky cases, it was possible for pg_rewind to remove
certain WAL segments from the rewound demoted primary.  In particular
this happens if those files have been marked for archival (i.e., their
.ready files were created) but not yet archived; the newly promoted node
no longer has such files because of them having been recycled, but they
are likely critical for recovery in the demoted node.  If pg_rewind
removes them, recovery is not possible anymore.

Fix this by maintaining a hash table of files in this situation in the
scan that looks for a checkpoint, which the decide_file_actions phase
can consult so that it knows to preserve them.

Back to 14.  The problem also exists in 13, but that branch was not
blessed with commit eb00f1d4bf96, so this  is difficult to apply
there.  Users of older releases will just have to continue to be extra
careful when rewinding.

Co-authored-by: Полина Бунгина (Polina Bungina) <[email protected]>
Co-authored-by: Alexander Kukushkin <[email protected]>
Reviewed-by: Kyotaro Horiguchi <[email protected]>
Reviewed-by: Atsushi Torikoshi <[email protected]>
Discussion: https://postgr.es/m/CAAtGL4AhzmBRsEsaDdz7065T+k+BscNadfTqP1NcPmsqwA5HBw@mail.gmail.com
src/bin/pg_rewind/filemap.c
src/bin/pg_rewind/filemap.h
src/bin/pg_rewind/meson.build
src/bin/pg_rewind/parsexlog.c
src/bin/pg_rewind/pg_rewind.c
src/bin/pg_rewind/t/010_keep_recycled_wals.pl[new file with mode: 0644]
src/tools/pgindent/typedefs.list