On Fri, 2008-08-08 at 12:57 +0100, Simon Riggs wrote:

> > Yes, statement_timeout may help. But, I don't want to use it, because the
> > *successful* backup is canceled.
> > 
> > How about checking whether the stoppoint was archived by comparing with
> > the last WAL archived. The archiver process can tell the last WAL archived.
> > Or, we can calculate it from the status file.
> 
> I think its easier to test whether the stopxlogfilename still exists in
> pg_xlog. If not, we know it has been archived away. We can add that as
> an extra condition inside the loop.
> 
> So thinking we should test XLogArchiveCheckDone() for both
> stopxlogfilename and history file and then stat for the stop WAL file:

This seems better.

-- 
 Simon Riggs           www.2ndQuadrant.com
 PostgreSQL Training, Services and Support
Index: src/backend/access/transam/xlog.c
===================================================================
RCS file: /home/sriggs/pg/REPOSITORY/pgsql/src/backend/access/transam/xlog.c,v
retrieving revision 1.316
diff -c -r1.316 xlog.c
*** src/backend/access/transam/xlog.c	13 Jul 2008 20:45:47 -0000	1.316
--- src/backend/access/transam/xlog.c	8 Aug 2008 13:56:40 -0000
***************
*** 1165,1170 ****
--- 1165,1184 ----
  	/* Retry creation of the .ready file */
  	if (create_if_missing)
  		XLogArchiveNotify(xlog);
+ 	else
+ 	{
+ 		char xlogpath[MAXPGPATH];
+ 
+ 		snprintf(xlogpath, MAXPGPATH, XLOGDIR "/%s", xlog);
+ 
+ 		/*
+ 		 * Check to see if the WAL file has been removed by checkpoint, 
+ 		 * which implies it has already been archived, and explains why we
+ 		 * can't see a status file for it.
+ 		 */
+ 		if (stat(xlogpath, &stat_buf) != 0)
+ 			return true;
+ 	}
  
  	return false;
  }
***************
*** 6721,6735 ****
  	CleanupBackupHistory();
  
  	/*
! 	 * Wait until the history file has been archived. We assume that the 
! 	 * alphabetic sorting property of the WAL files ensures the last WAL
! 	 * file is guaranteed archived by the time the history file is archived.
  	 *
  	 * We wait forever, since archive_command is supposed to work and
  	 * we assume the admin wanted his backup to work completely. If you 
  	 * don't wish to wait, you can SET statement_timeout = xx;
  	 *
! 	 * If the status file is missing, we assume that is because it was
  	 * set to .ready before we slept, then while asleep it has been set
  	 * to .done and then removed by a concurrent checkpoint.
  	 */
--- 6735,6748 ----
  	CleanupBackupHistory();
  
  	/*
! 	 * Wait until both the last WAL file filled during backup and the
! 	 * history file have been archived.
  	 *
  	 * We wait forever, since archive_command is supposed to work and
  	 * we assume the admin wanted his backup to work completely. If you 
  	 * don't wish to wait, you can SET statement_timeout = xx;
  	 *
! 	 * If the status files are missing, we assume that is because it was
  	 * set to .ready before we slept, then while asleep it has been set
  	 * to .done and then removed by a concurrent checkpoint.
  	 */
***************
*** 6739,6745 ****
  	seconds_before_warning = 60;
  	waits = 0;
  
! 	while (!XLogArchiveCheckDone(histfilepath, false))
  	{
  		CHECK_FOR_INTERRUPTS();
  
--- 6752,6759 ----
  	seconds_before_warning = 60;
  	waits = 0;
  
! 	while (!XLogArchiveCheckDone(histfilepath, false) || 
! 		   !XLogArchiveCheckDone(stopxlogfilename, false))
  	{
  		CHECK_FOR_INTERRUPTS();
  
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to