standby_online_backup_03.patch
application/octet-stream
Filename: standby_online_backup_03.patch
Type: application/octet-stream
Part: 0
diff -rcN postgresql/src/backend/access/transam/xlog.c postgresql_with_patch/src/backend/access/transam/xlog.c
*** postgresql/src/backend/access/transam/xlog.c 2011-06-30 10:04:48.000000000 +0900
--- postgresql_with_patch/src/backend/access/transam/xlog.c 2011-07-07 18:25:05.000000000 +0900
***************
*** 6284,6289 ****
--- 6284,6303 ----
/* use volatile pointer to prevent code rearrangement */
volatile XLogCtlData *xlogctl = XLogCtl;
+ /*
+ * get minRecoveryPoint before the value is changed for
+ * getting backup on standby server.
+ * check the result, set to pg_control.
+ */
+ XLogRecPtr prevminRecoveryPoint = ControlFile->minRecoveryPoint;
+ if (!ControlFile->backupserver)
+ {
+ if (prevminRecoveryPoint.xlogid == 0 && prevminRecoveryPoint.xrecoff == 0)
+ ControlFile->backupserver = BACKUPSERVER_MASTER;
+ else
+ ControlFile->backupserver = BACKUPSERVER_SLAVE;
+ }
+
/*
* Update pg_control to show that we are recovering and to show the
* selected checkpoint as the place we are starting from. We also mark
***************
*** 6592,6597 ****
--- 6606,6631 ----
/* Pop the error context stack */
error_context_stack = errcontext.previous;
+ /*
+ * Check whether to reach minRecoveryPoint when getting backup
+ * on standby server.
+ */
+ if (ControlFile->backupserver == BACKUPSERVER_SLAVE)
+ {
+ if (XLByteLE(prevminRecoveryPoint, EndRecPtr))
+ {
+ elog(DEBUG1, "end of backup reached in the control file");
+
+ LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
+
+ MemSet(&ControlFile->backupStartPoint, 0, sizeof(XLogRecPtr));
+ ControlFile->backupserver = BACKUPSERVER_NONE;
+ UpdateControlFile();
+
+ LWLockRelease(ControlFileLock);
+ }
+ }
+
/*
* Update shared recoveryLastRecPtr after this record has been
* replayed.
***************
*** 8512,8517 ****
--- 8546,8552 ----
if (XLByteLT(ControlFile->minRecoveryPoint, lsn))
ControlFile->minRecoveryPoint = lsn;
MemSet(&ControlFile->backupStartPoint, 0, sizeof(XLogRecPtr));
+ ControlFile->backupserver = BACKUPSERVER_NONE;
UpdateControlFile();
LWLockRelease(ControlFileLock);
diff -rcN postgresql/src/bin/pg_controldata/pg_controldata.c postgresql_with_patch/src/bin/pg_controldata/pg_controldata.c
*** postgresql/src/bin/pg_controldata/pg_controldata.c 2011-06-30 10:04:48.000000000 +0900
--- postgresql_with_patch/src/bin/pg_controldata/pg_controldata.c 2011-07-07 18:23:22.000000000 +0900
***************
*** 86,91 ****
--- 86,105 ----
return _("unrecognized wal_level");
}
+ static const char *
+ backupserver_str(BackupServer backupserver)
+ {
+ switch (backupserver)
+ {
+ case BACKUPSERVER_NONE:
+ return "none";
+ case BACKUPSERVER_MASTER:
+ return "master";
+ case BACKUPSERVER_SLAVE:
+ return "slave";
+ }
+ return _("unrecognized backupserver");
+ }
int
main(int argc, char *argv[])
***************
*** 232,237 ****
--- 246,253 ----
printf(_("Backup start location: %X/%X\n"),
ControlFile.backupStartPoint.xlogid,
ControlFile.backupStartPoint.xrecoff);
+ printf(_("Backup from: %s\n"),
+ backupserver_str(ControlFile.backupserver));
printf(_("Current wal_level setting: %s\n"),
wal_level_str(ControlFile.wal_level));
printf(_("Current max_connections setting: %d\n"),
diff -rcN postgresql/src/include/access/xlog.h postgresql_with_patch/src/include/access/xlog.h
*** postgresql/src/include/access/xlog.h 2011-06-30 10:04:48.000000000 +0900
--- postgresql_with_patch/src/include/access/xlog.h 2011-07-07 15:32:57.000000000 +0900
***************
*** 209,214 ****
--- 209,222 ----
} WalLevel;
extern int wal_level;
+ /* where to get backup */
+ typedef enum BackupServer
+ {
+ BACKUPSERVER_NONE = 0,
+ BACKUPSERVER_MASTER,
+ BACKUPSERVER_SLAVE,
+ } BackupServer;
+
#define XLogArchivingActive() (XLogArchiveMode && wal_level >= WAL_LEVEL_ARCHIVE)
#define XLogArchiveCommandSet() (XLogArchiveCommand[0] != '\0')
diff -rcN postgresql/src/include/catalog/pg_control.h postgresql_with_patch/src/include/catalog/pg_control.h
*** postgresql/src/include/catalog/pg_control.h 2011-06-30 10:04:48.000000000 +0900
--- postgresql_with_patch/src/include/catalog/pg_control.h 2011-07-07 18:23:56.000000000 +0900
***************
*** 142,147 ****
--- 142,157 ----
XLogRecPtr backupStartPoint;
/*
+ * Postgres keeps where to take a backup server.
+ *
+ * backupserver is "none" , "master" or "slave", its default is "none".
+ * When postgres starts and it is "none", it is updated to either "master"
+ * or "slave" with minRecoveryPoint of the backup server.
+ * When postgres reaches backup end location, it is updated to "none".
+ */
+ int backupserver;
+
+ /*
* Parameter settings that determine if the WAL can be used for archival
* or hot standby.
*/