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.
Patch enclosed.
Tests with make check and this sequence of actions works fine also...
initdb b512
pg_controldata b512
pg_resetxlog b512
pg_controldata b512
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 16:16:55 -0000
***************
*** 3391,3397 ****
WriteControlFile(void)
{
int fd;
! char buffer[BLCKSZ]; /* need not be aligned */
char *localeptr;
/*
--- 3391,3397 ----
WriteControlFile(void)
{
int fd;
! char buffer[XLOG_CONTROL_BLCKSZ]; /* need not be aligned */
char *localeptr;
/*
***************
*** 3437,3453 ****
FIN_CRC32(ControlFile->crc);
/*
! * We write out BLCKSZ bytes into pg_control, zero-padding the excess over
! * sizeof(ControlFileData). This reduces the odds of premature-EOF errors
! * when reading pg_control. We'll still fail when we check the contents
! * of the file, but hopefully with a more specific error than "couldn't
! * read pg_control".
*/
! if (sizeof(ControlFileData) > BLCKSZ)
ereport(PANIC,
! (errmsg("sizeof(ControlFileData) is larger than BLCKSZ; fix either one")));
! memset(buffer, 0, BLCKSZ);
memcpy(buffer, ControlFile, sizeof(ControlFileData));
fd = BasicOpenFile(XLOG_CONTROL_FILE,
--- 3437,3453 ----
FIN_CRC32(ControlFile->crc);
/*
! * We write out XLOG_CONTROL_BLCKSZ bytes into pg_control, zero-padding the
! * excess over sizeof(ControlFileData). This reduces the odds of
! * premature-EOF errors when reading pg_control. We'll still fail when we
! * check the contents of the file, but hopefully with a more specific error
! * than "couldn't read pg_control".
*/
! if (sizeof(ControlFileData) > XLOG_CONTROL_BLCKSZ)
ereport(PANIC,
! (errmsg("sizeof(ControlFileData) is larger than XLOG_CONTROL_BLCKSZ; fix either one")));
! memset(buffer, 0, XLOG_CONTROL_BLCKSZ);
memcpy(buffer, ControlFile, sizeof(ControlFileData));
fd = BasicOpenFile(XLOG_CONTROL_FILE,
***************
*** 3460,3466 ****
XLOG_CONTROL_FILE)));
errno = 0;
! if (write(fd, buffer, BLCKSZ) != BLCKSZ)
{
/* if write didn't set errno, assume problem is no disk space */
if (errno == 0)
--- 3460,3466 ----
XLOG_CONTROL_FILE)));
errno = 0;
! if (write(fd, buffer, XLOG_CONTROL_BLCKSZ) != XLOG_CONTROL_BLCKSZ)
{
/* if write didn't set errno, assume problem is no disk space */
if (errno == 0)
Index: src/bin/pg_resetxlog/pg_resetxlog.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/pg_resetxlog/pg_resetxlog.c,v
retrieving revision 1.41
diff -c -r1.41 pg_resetxlog.c
*** src/bin/pg_resetxlog/pg_resetxlog.c 3 Apr 2006 23:35:04 -0000 1.41
--- src/bin/pg_resetxlog/pg_resetxlog.c 4 Apr 2006 16:16:57 -0000
***************
*** 365,373 ****
}
/* Use malloc to ensure we have a maxaligned buffer */
! buffer = (char *) malloc(BLCKSZ);
! len = read(fd, buffer, BLCKSZ);
if (len < 0)
{
fprintf(stderr, _("%s: could not read file \"%s\": %s\n"),
--- 365,373 ----
}
/* Use malloc to ensure we have a maxaligned buffer */
! buffer = (char *) malloc(XLOG_CONTROL_BLCKSZ);
! len = read(fd, buffer, XLOG_CONTROL_BLCKSZ);
if (len < 0)
{
fprintf(stderr, _("%s: could not read file \"%s\": %s\n"),
***************
*** 546,552 ****
RewriteControlFile(void)
{
int fd;
! char buffer[BLCKSZ]; /* need not be aligned */
/*
* Adjust fields as needed to force an empty XLOG starting at the next
--- 546,552 ----
RewriteControlFile(void)
{
int fd;
! char buffer[XLOG_CONTROL_BLCKSZ]; /* need not be aligned */
/*
* Adjust fields as needed to force an empty XLOG starting at the next
***************
*** 587,607 ****
FIN_CRC32(ControlFile.crc);
/*
! * We write out BLCKSZ bytes into pg_control, zero-padding the excess over
! * sizeof(ControlFileData). This reduces the odds of premature-EOF errors
! * when reading pg_control. We'll still fail when we check the contents
! * of the file, but hopefully with a more specific error than "couldn't
! * read pg_control".
*/
! if (sizeof(ControlFileData) > BLCKSZ)
{
fprintf(stderr,
! _("%s: internal error -- sizeof(ControlFileData) is too large ... fix xlog.c\n"),
progname);
exit(1);
}
! memset(buffer, 0, BLCKSZ);
memcpy(buffer, &ControlFile, sizeof(ControlFileData));
unlink(XLOG_CONTROL_FILE);
--- 587,607 ----
FIN_CRC32(ControlFile.crc);
/*
! * We write out XLOG_CONTROL_BLCKSZ bytes into pg_control, zero-padding the
! * excess over sizeof(ControlFileData). This reduces the odds of
! * premature-EOF errors when reading pg_control. We'll still fail when we
! * check the contents of the file, but hopefully with a more specific error
! * than "couldn't read pg_control".
*/
! if (sizeof(ControlFileData) > XLOG_CONTROL_BLCKSZ)
{
fprintf(stderr,
! _("%s: internal error -- sizeof(ControlFileData) is too large ... fix XLOG_CONTROL_BLCKSZ\n"),
progname);
exit(1);
}
! memset(buffer, 0, XLOG_CONTROL_BLCKSZ);
memcpy(buffer, &ControlFile, sizeof(ControlFileData));
unlink(XLOG_CONTROL_FILE);
***************
*** 617,623 ****
}
errno = 0;
! if (write(fd, buffer, BLCKSZ) != BLCKSZ)
{
/* if write didn't set errno, assume problem is no disk space */
if (errno == 0)
--- 617,623 ----
}
errno = 0;
! if (write(fd, buffer, XLOG_CONTROL_BLCKSZ) != XLOG_CONTROL_BLCKSZ)
{
/* if write didn't set errno, assume problem is no disk space */
if (errno == 0)
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 16:16:58 -0000
***************
*** 190,195 ****
--- 190,196 ----
*/
#define XLOGDIR "pg_xlog"
#define XLOG_CONTROL_FILE "global/pg_control"
+ #define XLOG_CONTROL_BLCKSZ 512
/*
* These macros encapsulate knowledge about the exact layout of XLog file
---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?
http://www.postgresql.org/docs/faq