Commit b457b2a2 authored by Heikki Linnakangas's avatar Heikki Linnakangas

If pg_stop_backup() is called just after switching to a new xlog file,

wait for the previous instead of the new file to be archived.

Based on patch by Simon Riggs.
parent b0729b8d
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.322 2008/11/09 17:51:15 tgl Exp $ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.323 2008/12/03 08:20:11 heikki Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -6674,6 +6674,8 @@ pg_stop_backup(PG_FUNCTION_ARGS) ...@@ -6674,6 +6674,8 @@ pg_stop_backup(PG_FUNCTION_ARGS)
char histfilepath[MAXPGPATH]; char histfilepath[MAXPGPATH];
char startxlogfilename[MAXFNAMELEN]; char startxlogfilename[MAXFNAMELEN];
char stopxlogfilename[MAXFNAMELEN]; char stopxlogfilename[MAXFNAMELEN];
char lastxlogfilename[MAXFNAMELEN];
char histfilename[MAXFNAMELEN];
uint32 _logId; uint32 _logId;
uint32 _logSeg; uint32 _logSeg;
FILE *lfp; FILE *lfp;
...@@ -6801,14 +6803,18 @@ pg_stop_backup(PG_FUNCTION_ARGS) ...@@ -6801,14 +6803,18 @@ pg_stop_backup(PG_FUNCTION_ARGS)
* we assume the admin wanted his backup to work completely. If you * we assume the admin wanted his backup to work completely. If you
* don't wish to wait, you can set statement_timeout. * don't wish to wait, you can set statement_timeout.
*/ */
BackupHistoryFileName(histfilepath, ThisTimeLineID, _logId, _logSeg, XLByteToPrevSeg(stoppoint, _logId, _logSeg);
XLogFileName(lastxlogfilename, ThisTimeLineID, _logId, _logSeg);
XLByteToSeg(startpoint, _logId, _logSeg);
BackupHistoryFileName(histfilename, ThisTimeLineID, _logId, _logSeg,
startpoint.xrecoff % XLogSegSize); startpoint.xrecoff % XLogSegSize);
seconds_before_warning = 60; seconds_before_warning = 60;
waits = 0; waits = 0;
while (XLogArchiveIsBusy(stopxlogfilename) || while (XLogArchiveIsBusy(lastxlogfilename) ||
XLogArchiveIsBusy(histfilepath)) XLogArchiveIsBusy(histfilename))
{ {
CHECK_FOR_INTERRUPTS(); CHECK_FOR_INTERRUPTS();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment