Don't use BLCKSZ for the physical length of the pg_control file, but
authorTom Lane
Tue, 4 Apr 2006 22:39:59 +0000 (22:39 +0000)
committerTom Lane
Tue, 4 Apr 2006 22:39:59 +0000 (22:39 +0000)
instead a dedicated symbol.  This probably makes no functional difference
for likely values of BLCKSZ, but it makes the intent clearer.
Simon Riggs, minor editorialization by Tom Lane.

src/backend/access/transam/xlog.c
src/bin/pg_resetxlog/pg_resetxlog.c
src/include/catalog/pg_control.h

index a4ae78bcdef82d23358da936fa6f420f943f7814..a29246ac239b61d37033c5debbbe30326ddf48f1 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.232 2006/04/03 23:35:03 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.233 2006/04/04 22:39:59 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -3391,7 +3391,7 @@ static void
 WriteControlFile(void)
 {
    int         fd;
-   char        buffer[BLCKSZ]; /* need not be aligned */
+   char        buffer[PG_CONTROL_SIZE]; /* need not be aligned */
    char       *localeptr;
 
    /*
@@ -3437,17 +3437,16 @@ WriteControlFile(void)
    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".
+    * We write out PG_CONTROL_SIZE 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")));
+   if (sizeof(ControlFileData) > PG_CONTROL_SIZE)
+       elog(PANIC, "sizeof(ControlFileData) is larger than PG_CONTROL_SIZE; fix either one");
 
-   memset(buffer, 0, BLCKSZ);
+   memset(buffer, 0, PG_CONTROL_SIZE);
    memcpy(buffer, ControlFile, sizeof(ControlFileData));
 
    fd = BasicOpenFile(XLOG_CONTROL_FILE,
@@ -3460,7 +3459,7 @@ WriteControlFile(void)
                        XLOG_CONTROL_FILE)));
 
    errno = 0;
-   if (write(fd, buffer, BLCKSZ) != BLCKSZ)
+   if (write(fd, buffer, PG_CONTROL_SIZE) != PG_CONTROL_SIZE)
    {
        /* if write didn't set errno, assume problem is no disk space */
        if (errno == 0)
index c680ecdbb2ca1c8d96e9df99e9d25bd8d23caf6b..89ba857a7865a03b69bbabdbde392ff4f2bb459f 100644 (file)
@@ -23,7 +23,7 @@
  * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/bin/pg_resetxlog/pg_resetxlog.c,v 1.41 2006/04/03 23:35:04 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_resetxlog/pg_resetxlog.c,v 1.42 2006/04/04 22:39:59 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -365,9 +365,9 @@ ReadControlFile(void)
    }
 
    /* Use malloc to ensure we have a maxaligned buffer */
-   buffer = (char *) malloc(BLCKSZ);
+   buffer = (char *) malloc(PG_CONTROL_SIZE);
 
-   len = read(fd, buffer, BLCKSZ);
+   len = read(fd, buffer, PG_CONTROL_SIZE);
    if (len < 0)
    {
        fprintf(stderr, _("%s: could not read file \"%s\": %s\n"),
@@ -546,7 +546,7 @@ static void
 RewriteControlFile(void)
 {
    int         fd;
-   char        buffer[BLCKSZ]; /* need not be aligned */
+   char        buffer[PG_CONTROL_SIZE]; /* need not be aligned */
 
    /*
     * Adjust fields as needed to force an empty XLOG starting at the next
@@ -587,21 +587,21 @@ RewriteControlFile(void)
    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".
+    * We write out PG_CONTROL_SIZE 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)
+   if (sizeof(ControlFileData) > PG_CONTROL_SIZE)
    {
        fprintf(stderr,
-               _("%s: internal error -- sizeof(ControlFileData) is too large ... fix xlog.c\n"),
+               _("%s: internal error -- sizeof(ControlFileData) is too large ... fix PG_CONTROL_SIZE\n"),
                progname);
        exit(1);
    }
 
-   memset(buffer, 0, BLCKSZ);
+   memset(buffer, 0, PG_CONTROL_SIZE);
    memcpy(buffer, &ControlFile, sizeof(ControlFileData));
 
    unlink(XLOG_CONTROL_FILE);
@@ -617,7 +617,7 @@ RewriteControlFile(void)
    }
 
    errno = 0;
-   if (write(fd, buffer, BLCKSZ) != BLCKSZ)
+   if (write(fd, buffer, PG_CONTROL_SIZE) != PG_CONTROL_SIZE)
    {
        /* if write didn't set errno, assume problem is no disk space */
        if (errno == 0)
index ba54fdc8e6ff4e115b2074beb688b590648a9459..02c51dd9f353d16c01900a7adc2cf4e9e64dbf39 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_control.h,v 1.28 2006/04/03 23:35:05 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_control.h,v 1.29 2006/04/04 22:39:59 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -147,4 +147,13 @@ typedef struct ControlFileData
    pg_crc32    crc;
 } ControlFileData;
 
+/*
+ * Physical size of the pg_control file.  Note that this is considerably
+ * bigger than the actually used size (ie, sizeof(ControlFileData)).
+ * The idea is to keep the physical size constant independent of format
+ * changes, so that ReadControlFile will deliver a suitable wrong-version
+ * message instead of a read error if it's looking at an incompatible file.
+ */
+#define PG_CONTROL_SIZE        8192
+
 #endif   /* PG_CONTROL_H */