On Thu, Nov 22, 2018 at 01:16:09PM +0900, Michael Paquier wrote: > No, pgarch_readyXLog() should still look after .ready files as those are > here for this purpose, but we could have an additional check to see if > the segment linked with it actually exists and can be archived. This > check could happen in pgarch.c code before calling the archive command > gets called (just before pgarch_ArchiverCopyLoop and after > XLogArchiveCommandSet feels rather right, and that it should be cheap > enough to call stat()).
s/pgarch_ArchiverCopyLoop/pgarch_archiveXlog/. Attached is a patch showing shaped based on the idea of upthread. Thoughts? -- Michael
diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c index 844b9d1b0e..1cc788ca83 100644 --- a/src/backend/postmaster/pgarch.c +++ b/src/backend/postmaster/pgarch.c @@ -28,6 +28,7 @@ #include <fcntl.h> #include <signal.h> #include <time.h> +#include <sys/stat.h> #include <sys/time.h> #include <sys/wait.h> #include <unistd.h> @@ -427,6 +428,9 @@ pgarch_ArchiverCopyLoop(void) for (;;) { + struct stat stat_buf; + char pathname[MAXPGPATH]; + /* * Do not initiate any more archive commands after receiving * SIGTERM, nor after the postmaster has died unexpectedly. The @@ -456,6 +460,25 @@ pgarch_ArchiverCopyLoop(void) return; } + /* + * In the event of a system crash, archive status files may be + * left behind as their removals are not durable, cleaning up + * orphan entries here is the cheapest method. So check that + * the segment trying to be archived still exists. + */ + snprintf(pathname, MAXPGPATH, XLOGDIR "/%s", xlog); + if (stat(pathname, &stat_buf) != 0) + { + char xlogready[MAXPGPATH]; + + StatusFilePath(xlogready, xlog, ".ready"); + if (durable_unlink(xlogready, WARNING) == 0) + ereport(WARNING, + (errmsg("removed orphan archive status file %s", + xlogready))); + return; + } + if (pgarch_archiveXlog(xlog)) { /* successful */
signature.asc
Description: PGP signature