On Tue, 2006-04-04 at 17:33 +0100, Simon Riggs wrote:
> On Tue, 2006-04-04 at 11:13 -0400, Tom Lane wrote:
> > Simon Riggs <[EMAIL PROTECTED]> writes:
> > > I see you've changed the control file back from XLOG_BLCKSZ to BLCKSZ; I
> > > wasn't sure which one of those to choose.
> > 
> > Hm.  The entire point of having a BLCKSZ-sized control file is to have
> > it *not* change in size across format revisions (see the comments) ...
> > which I suppose means that we really ought to have a hard-wired separate
> > constant, rather than depending on something that someone might want to
> > twiddle.

An additional patch enclosed that adds xlog blcksz onto the xlog long
header at the start of each xlog file, so we can cross-check between
file and system, as we do with xlog seg size.

(This is an *additional* patch, not a replacement one).

Best Regards, Simon Riggs
Index: src/backend/access/transam/xlog.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/access/transam/xlog.c,v
retrieving revision 1.232
diff -c -r1.232 xlog.c
*** src/backend/access/transam/xlog.c	3 Apr 2006 23:35:03 -0000	1.232
--- src/backend/access/transam/xlog.c	4 Apr 2006 19:05:37 -0000
***************
*** 1265,1270 ****
--- 1265,1271 ----
  
  		NewLongPage->xlp_sysid = ControlFile->system_identifier;
  		NewLongPage->xlp_seg_size = XLogSegSize;
+         NewLongPage->xlp_xlog_blcksz = XLOG_BLCKSZ;
  		NewPage   ->xlp_info |= XLP_LONG_HEADER;
  
  		Insert->currpos = ((char *) NewPage) +SizeOfXLogLongPHD;
***************
*** 2993,2998 ****
--- 2994,3006 ----
  					(errmsg("WAL file is from different system"),
  					 errdetail("Incorrect XLOG_SEG_SIZE in page header.")));
  			return false;
+         }
+ 		if (longhdr->xlp_xlog_blcksz != XLOG_BLCKSZ)
+ 		{
+ 			ereport(emode,
+ 					(errmsg("WAL file is from different system"),
+ 					 errdetail("Incorrect XLOG_BLCKSZ in page header.")));
+ 			return false;
  		}
  	}
  	recaddr.xlogid = readId;
***************
*** 3839,3844 ****
--- 3847,3853 ----
  	longpage = (XLogLongPageHeader) page;
  	longpage->xlp_sysid = sysidentifier;
  	longpage->xlp_seg_size = XLogSegSize;
+     longpage->xlp_xlog_blcksz = XLOG_BLCKSZ;
  
  	/* Insert the initial checkpoint record */
  	record = (XLogRecord *) ((char *) page + SizeOfXLogLongPHD);
Index: src/include/access/xlog_internal.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/access/xlog_internal.h,v
retrieving revision 1.12
diff -c -r1.12 xlog_internal.h
*** src/include/access/xlog_internal.h	3 Apr 2006 23:35:04 -0000	1.12
--- src/include/access/xlog_internal.h	4 Apr 2006 19:05:48 -0000
***************
*** 93,98 ****
--- 93,99 ----
  	XLogPageHeaderData std;		/* standard header fields */
  	uint64		xlp_sysid;		/* system identifier from pg_control */
  	uint32		xlp_seg_size;	/* just as a cross-check */
+     uint32      xlp_xlog_blcksz;  /* just as a cross-check */
  } XLogLongPageHeaderData;
  
  #define SizeOfXLogLongPHD	MAXALIGN(sizeof(XLogLongPageHeaderData))
---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faq

Reply via email to