This patch makes pg_upgrade controldata checks more consistent, and adds
a missing check for float8_pass_by_value.

-- 
  Bruce Momjian  <br...@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + Everyone has their own god. +
diff --git a/src/bin/pg_upgrade/controldata.c b/src/bin/pg_upgrade/controldata.c
new file mode 100644
index bf53db0..0608b64
*** a/src/bin/pg_upgrade/controldata.c
--- b/src/bin/pg_upgrade/controldata.c
*************** get_control_data(ClusterInfo *cluster, b
*** 154,176 ****
  			p++;				/* remove ':' char */
  			cluster->controldata.cat_ver = str2uint(p);
  		}
- 		else if ((p = strstr(bufin, "First log segment after reset:")) != NULL)
- 		{
- 			/* Skip the colon and any whitespace after it */
- 			p = strchr(p, ':');
- 			if (p == NULL || strlen(p) <= 1)
- 				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
- 			p = strpbrk(p, "01234567890ABCDEF");
- 			if (p == NULL || strlen(p) <= 1)
- 				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
- 
- 			/* Make sure it looks like a valid WAL file name */
- 			if (strspn(p, "0123456789ABCDEF") != 24)
- 				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
- 
- 			strlcpy(cluster->controldata.nextxlogfile, p, 25);
- 			got_nextxlogfile = true;
- 		}
  		else if ((p = strstr(bufin, "First log file ID after reset:")) != NULL)
  		{
  			p = strchr(p, ':');
--- 154,159 ----
*************** get_control_data(ClusterInfo *cluster, b
*** 201,207 ****
  				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
  
  			p++;				/* remove ':' char */
! 			cluster->controldata.chkpnt_tli = str2uint(p);
  			got_tli = true;
  		}
  		else if ((p = strstr(bufin, "Latest checkpoint's NextXID:")) != NULL)
--- 184,190 ----
  				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
  
  			p++;				/* remove ':' char */
! 			tli = str2uint(p);
  			got_tli = true;
  		}
  		else if ((p = strstr(bufin, "Latest checkpoint's NextXID:")) != NULL)
*************** get_control_data(ClusterInfo *cluster, b
*** 266,271 ****
--- 249,271 ----
  			cluster->controldata.chkpnt_nxtmxoff = str2uint(p);
  			got_mxoff = true;
  		}
+ 		else if ((p = strstr(bufin, "First log segment after reset:")) != NULL)
+ 		{
+ 			/* Skip the colon and any whitespace after it */
+ 			p = strchr(p, ':');
+ 			if (p == NULL || strlen(p) <= 1)
+ 				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+ 			p = strpbrk(p, "01234567890ABCDEF");
+ 			if (p == NULL || strlen(p) <= 1)
+ 				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+ 
+ 			/* Make sure it looks like a valid WAL file name */
+ 			if (strspn(p, "0123456789ABCDEF") != 24)
+ 				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+ 
+ 			strlcpy(cluster->controldata.nextxlogfile, p, 25);
+ 			got_nextxlogfile = true;
+ 		}
  		else if ((p = strstr(bufin, "Maximum data alignment:")) != NULL)
  		{
  			p = strchr(p, ':');
*************** get_control_data(ClusterInfo *cluster, b
*** 436,442 ****
  	 */
  	if (GET_MAJOR_VERSION(cluster->major_version) <= 902)
  	{
! 		if (got_log_id && got_log_seg)
  		{
  			snprintf(cluster->controldata.nextxlogfile, 25, "%08X%08X%08X",
  					 tli, logid, segno);
--- 436,442 ----
  	 */
  	if (GET_MAJOR_VERSION(cluster->major_version) <= 902)
  	{
! 		if (got_tli && got_log_id && got_log_seg)
  		{
  			snprintf(cluster->controldata.nextxlogfile, 25, "%08X%08X%08X",
  					 tli, logid, segno);
*************** get_control_data(ClusterInfo *cluster, b
*** 446,456 ****
  
  	/* verify that we got all the mandatory pg_control data */
  	if (!got_xid || !got_oid ||
! 		!got_multi || !got_mxoff ||
  		(!got_oldestmulti &&
  		 cluster->controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER) ||
! 		(!live_check && !got_nextxlogfile) ||
! 		!got_tli ||
  		!got_align || !got_blocksz || !got_largesz || !got_walsz ||
  		!got_walseg || !got_ident || !got_index || !got_toast ||
  		(!got_large_object &&
--- 446,455 ----
  
  	/* verify that we got all the mandatory pg_control data */
  	if (!got_xid || !got_oid ||
! 		!got_multi ||
  		(!got_oldestmulti &&
  		 cluster->controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER) ||
! 		!got_mxoff || (!live_check && !got_nextxlogfile) ||
  		!got_align || !got_blocksz || !got_largesz || !got_walsz ||
  		!got_walseg || !got_ident || !got_index || !got_toast ||
  		(!got_large_object &&
*************** get_control_data(ClusterInfo *cluster, b
*** 470,488 ****
  		if (!got_multi)
  			pg_log(PG_REPORT, "  latest checkpoint next MultiXactId\n");
  
- 		if (!got_mxoff)
- 			pg_log(PG_REPORT, "  latest checkpoint next MultiXactOffset\n");
- 
  		if (!got_oldestmulti &&
  			cluster->controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
  			pg_log(PG_REPORT, "  latest checkpoint oldest MultiXactId\n");
  
  		if (!live_check && !got_nextxlogfile)
  			pg_log(PG_REPORT, "  first WAL segment after reset\n");
  
- 		if (!got_tli)
- 			pg_log(PG_REPORT, "  latest checkpoint timeline ID\n");
- 
  		if (!got_align)
  			pg_log(PG_REPORT, "  maximum alignment\n");
  
--- 469,484 ----
  		if (!got_multi)
  			pg_log(PG_REPORT, "  latest checkpoint next MultiXactId\n");
  
  		if (!got_oldestmulti &&
  			cluster->controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
  			pg_log(PG_REPORT, "  latest checkpoint oldest MultiXactId\n");
  
+ 		if (!got_mxoff)
+ 			pg_log(PG_REPORT, "  latest checkpoint next MultiXactOffset\n");
+ 
  		if (!live_check && !got_nextxlogfile)
  			pg_log(PG_REPORT, "  first WAL segment after reset\n");
  
  		if (!got_align)
  			pg_log(PG_REPORT, "  maximum alignment\n");
  
*************** check_control_data(ControlData *oldctrl,
*** 568,573 ****
--- 564,572 ----
  	if (oldctrl->date_is_int != newctrl->date_is_int)
  		pg_fatal("old and new pg_controldata date/time storage types do not match\n");
  
+ 	if (oldctrl->float8_pass_by_value != newctrl->float8_pass_by_value)
+ 		pg_fatal("old and new pg_controldata float8 argument passing methods do not match\n");
+ 
  	/*
  	 * We might eventually allow upgrades from checksum to no-checksum
  	 * clusters.
diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h
new file mode 100644
index bb035e1..aecf0df
*** a/src/bin/pg_upgrade/pg_upgrade.h
--- b/src/bin/pg_upgrade/pg_upgrade.h
*************** typedef struct
*** 206,212 ****
  	uint32		ctrl_ver;
  	uint32		cat_ver;
  	char		nextxlogfile[25];
- 	uint32		chkpnt_tli;
  	uint32		chkpnt_nxtxid;
  	uint32		chkpnt_nxtepoch;
  	uint32		chkpnt_nxtoid;
--- 206,211 ----
-- 
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