summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian2014-09-11 22:39:46 +0000
committerBruce Momjian2014-09-11 22:39:51 +0000
commit022aea346def58d5dd17dd0e012f925e8688d439 (patch)
treeb11a9013f271a94d7dea423e45b3ffc15c1d0624
parentb8b4124011322b7e376f9e21b3d335a85a28f54c (diff)
pg_upgrade: preserve the timestamp epoch
This is useful for replication tools like Slony and Skytools. This is a backpatch of a74a4aa23bb95b590ff01ee564219d2eacea3706. Report by Sergey Konoplev Backpatch through 9.3
-rw-r--r--contrib/pg_upgrade/controldata.c16
-rw-r--r--contrib/pg_upgrade/pg_upgrade.c8
-rw-r--r--contrib/pg_upgrade/pg_upgrade.h1
3 files changed, 17 insertions, 8 deletions
diff --git a/contrib/pg_upgrade/controldata.c b/contrib/pg_upgrade/controldata.c
index 13c95a2e2e9..16f535b37b6 100644
--- a/contrib/pg_upgrade/controldata.c
+++ b/contrib/pg_upgrade/controldata.c
@@ -233,16 +233,20 @@ get_control_data(ClusterInfo *cluster, bool live_check)
}
else if ((p = strstr(bufin, "Latest checkpoint's NextXID:")) != NULL)
{
- char *op = strchr(p, '/');
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
- if (op == NULL)
- op = strchr(p, ':');
+ p++; /* removing ':' char */
+ cluster->controldata.chkpnt_nxtepoch = str2uint(p);
- if (op == NULL || strlen(op) <= 1)
+ p = strchr(p, '/');
+ if (p == NULL || strlen(p) <= 1)
pg_fatal("%d: controldata retrieval problem\n", __LINE__);
- op++; /* removing ':' char */
- cluster->controldata.chkpnt_nxtxid = str2uint(op);
+ p++; /* removing '/' char */
+ cluster->controldata.chkpnt_nxtxid = str2uint(p);
got_xid = true;
}
else if ((p = strstr(bufin, "Latest checkpoint's NextOID:")) != NULL)
diff --git a/contrib/pg_upgrade/pg_upgrade.c b/contrib/pg_upgrade/pg_upgrade.c
index 16ffd5f652a..7a18e4e5f8a 100644
--- a/contrib/pg_upgrade/pg_upgrade.c
+++ b/contrib/pg_upgrade/pg_upgrade.c
@@ -422,12 +422,16 @@ copy_clog_xlog_xid(void)
/* copy old commit logs to new data dir */
copy_subdir_files("pg_clog");
- /* set the next transaction id of the new cluster */
- prep_status("Setting next transaction ID for new cluster");
+ /* set the next transaction id and epoch of the new cluster */
+ prep_status("Setting next transaction ID and epoch for new cluster");
exec_prog(UTILITY_LOG_FILE, NULL, true,
"\"%s/pg_resetxlog\" -f -x %u \"%s\"",
new_cluster.bindir, old_cluster.controldata.chkpnt_nxtxid,
new_cluster.pgdata);
+ exec_prog(UTILITY_LOG_FILE, NULL, true,
+ "\"%s/pg_resetxlog\" -f -e %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_nxtepoch,
+ new_cluster.pgdata);
check_ok();
/*
diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h
index 5619dc2c8de..5dc7895f9f5 100644
--- a/contrib/pg_upgrade/pg_upgrade.h
+++ b/contrib/pg_upgrade/pg_upgrade.h
@@ -190,6 +190,7 @@ typedef struct
char nextxlogfile[25];
uint32 chkpnt_tli;
uint32 chkpnt_nxtxid;
+ uint32 chkpnt_nxtepoch;
uint32 chkpnt_nxtoid;
uint32 chkpnt_nxtmulti;
uint32 chkpnt_nxtmxoff;