Bonjour Michaƫl,
On Sat, 23 Mar 2019, Michael Paquier wrote:
On Fri, Mar 22, 2019 at 03:18:26PM +0100, Fabien COELHO wrote:
Attached is a quick patch about "pg_rewind", so that the control file
is updated after everything else is committed to disk.
Could you start a new thread about that please? This one has already
been used for too many things.
Here it is.
The attached patch reorders the cluster fsyncing and control file changes
in "pg_rewind" so that the later is done after all data are committed to
disk, so as to reflect the actual cluster status, similarly to what is
done by "pg_checksums", per discussion in the thread about offline
enabling of checksums:
https://www.postgresql.org/message-id/20181221201616.gd4...@nighthawk.caipicrew.dd-dns.de
--
Fabien.
diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c
index 3dcadb9b40..c1e6d7cd07 100644
--- a/src/bin/pg_rewind/pg_rewind.c
+++ b/src/bin/pg_rewind/pg_rewind.c
@@ -351,9 +351,12 @@ main(int argc, char **argv)
progress_report(true);
- pg_log(PG_PROGRESS, "\ncreating backup label and updating control file\n");
+ pg_log(PG_PROGRESS, "\ncreating backup label\n");
createBackupLabel(chkptredo, chkpttli, chkptrec);
+ pg_log(PG_PROGRESS, "syncing target data directory\n");
+ syncTargetDirectory();
+
/*
* Update control file of target. Make it ready to perform archive
* recovery when restarting.
@@ -362,6 +365,7 @@ main(int argc, char **argv)
* source server. Like in an online backup, it's important that we recover
* all the WAL that was generated while we copied the files over.
*/
+ pg_log(PG_PROGRESS, "updating control file\n");
memcpy(&ControlFile_new, &ControlFile_source, sizeof(ControlFileData));
if (connstr_source)
@@ -377,11 +381,9 @@ main(int argc, char **argv)
ControlFile_new.minRecoveryPoint = endrec;
ControlFile_new.minRecoveryPointTLI = endtli;
ControlFile_new.state = DB_IN_ARCHIVE_RECOVERY;
+
update_controlfile(datadir_target, progname, &ControlFile_new, do_sync);
- pg_log(PG_PROGRESS, "syncing target data directory\n");
- syncTargetDirectory();
-
printf(_("Done!\n"));
return 0;