Improve coding of log_heap_clean() and heap_xlog_clean().
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 23 Feb 2003 20:32:12 +0000 (20:32 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 23 Feb 2003 20:32:12 +0000 (20:32 +0000)
src/backend/access/heap/heapam.c
src/backend/commands/vacuum.c
src/backend/commands/vacuumlazy.c
src/include/access/heapam.h

index cb0c28c778aa8a88b80ea6f35039591529e29c09..7ef0bf2d55857350a14bda9679500354f4e424e3 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.150 2003/02/13 05:35:07 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.151 2003/02/23 20:32:11 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -1891,36 +1891,40 @@ heap_restrpos(HeapScanDesc scan)
 }
 
 XLogRecPtr
-log_heap_clean(Relation reln, Buffer buffer, char *unused, int unlen)
+log_heap_clean(Relation reln, Buffer buffer, OffsetNumber *unused, int uncnt)
 {
        xl_heap_clean xlrec;
        XLogRecPtr      recptr;
-       XLogRecData rdata[3];
+       XLogRecData rdata[2];
 
        /* Caller should not call me on a temp relation */
        Assert(!reln->rd_istemp);
 
        xlrec.node = reln->rd_node;
        xlrec.block = BufferGetBlockNumber(buffer);
+
        rdata[0].buffer = InvalidBuffer;
        rdata[0].data = (char *) &xlrec;
        rdata[0].len = SizeOfHeapClean;
        rdata[0].next = &(rdata[1]);
 
-       if (unlen > 0)
+       /*
+        * The unused-offsets array is not actually in the buffer, but pretend
+        * that it is.  When XLogInsert stores the whole buffer, the offsets
+        * array need not be stored too.
+        */
+       rdata[1].buffer = buffer;
+       if (uncnt > 0)
        {
-               rdata[1].buffer = buffer;
-               rdata[1].data = unused;
-               rdata[1].len = unlen;
-               rdata[1].next = &(rdata[2]);
+               rdata[1].data = (char *) unused;
+               rdata[1].len = uncnt * sizeof(OffsetNumber);
        }
        else
-               rdata[0].next = &(rdata[2]);
-
-       rdata[2].buffer = buffer;
-       rdata[2].data = NULL;
-       rdata[2].len = 0;
-       rdata[2].next = NULL;
+       {
+               rdata[1].data = NULL;
+               rdata[1].len = 0;
+       }
+       rdata[1].next = NULL;
 
        recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_CLEAN, rdata);
 
@@ -2032,7 +2036,6 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record)
                return;
 
        reln = XLogOpenRelation(redo, RM_HEAP_ID, xlrec->node);
-
        if (!RelationIsValid(reln))
                return;
 
@@ -2052,18 +2055,14 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record)
 
        if (record->xl_len > SizeOfHeapClean)
        {
-               OffsetNumber unbuf[BLCKSZ / sizeof(OffsetNumber)];
-               OffsetNumber *unused = unbuf;
-               char       *unend;
+               OffsetNumber *unused;
+               OffsetNumber *unend;
                ItemId          lp;
 
-               Assert((record->xl_len - SizeOfHeapClean) <= BLCKSZ);
-               memcpy((char *) unbuf,
-                          (char *) xlrec + SizeOfHeapClean,
-                          record->xl_len - SizeOfHeapClean);
-               unend = (char *) unbuf + (record->xl_len - SizeOfHeapClean);
+               unused = (OffsetNumber *) ((char *) xlrec + SizeOfHeapClean);
+               unend = (OffsetNumber *) ((char *) xlrec + record->xl_len);
 
-               while ((char *) unused < unend)
+               while (unused < unend)
                {
                        lp = PageGetItemId(page, *unused + 1);
                        lp->lp_flags &= ~LP_USED;
index ac45a5df69d457c02cb79a2b384f6af9559f8500..ad79d0923ebef8d36a3003f264eb758fc7f44070 100644 (file)
@@ -13,7 +13,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.248 2003/02/22 00:45:05 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.249 2003/02/23 20:32:12 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2386,8 +2386,7 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
                if (vacpage->blkno == (blkno - 1) &&
                        vacpage->offsets_free > 0)
                {
-                       OffsetNumber unbuf[BLCKSZ / sizeof(OffsetNumber)];
-                       OffsetNumber *unused = unbuf;
+                       OffsetNumber unused[BLCKSZ / sizeof(OffsetNumber)];
                        int                     uncnt;
 
                        buf = ReadBuffer(onerel, vacpage->blkno);
@@ -2430,8 +2429,7 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
                        {
                                XLogRecPtr      recptr;
 
-                               recptr = log_heap_clean(onerel, buf, (char *) unused,
-                                                 (char *) (&(unused[uncnt])) - (char *) unused);
+                               recptr = log_heap_clean(onerel, buf, unused, uncnt);
                                PageSetLSN(page, recptr);
                                PageSetSUI(page, ThisStartUpID);
                        }
@@ -2555,8 +2553,7 @@ vacuum_heap(VRelStats *vacrelstats, Relation onerel, VacPageList vacuum_pages)
 static void
 vacuum_page(Relation onerel, Buffer buffer, VacPage vacpage)
 {
-       OffsetNumber unbuf[BLCKSZ / sizeof(OffsetNumber)];
-       OffsetNumber *unused = unbuf;
+       OffsetNumber unused[BLCKSZ / sizeof(OffsetNumber)];
        int                     uncnt;
        Page            page = BufferGetPage(buffer);
        ItemId          itemid;
@@ -2580,8 +2577,7 @@ vacuum_page(Relation onerel, Buffer buffer, VacPage vacpage)
        {
                XLogRecPtr      recptr;
 
-               recptr = log_heap_clean(onerel, buffer, (char *) unused,
-                                                 (char *) (&(unused[uncnt])) - (char *) unused);
+               recptr = log_heap_clean(onerel, buffer, unused, uncnt);
                PageSetLSN(page, recptr);
                PageSetSUI(page, ThisStartUpID);
        }
index 9790ef30bc43a7b81e7f1d6e3599a494129ed8ab..00bd905addfc94ee97b76ae56722803b933307d3 100644 (file)
@@ -31,7 +31,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/vacuumlazy.c,v 1.24 2003/02/22 00:45:05 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/vacuumlazy.c,v 1.25 2003/02/23 20:32:12 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -497,8 +497,7 @@ static int
 lazy_vacuum_page(Relation onerel, BlockNumber blkno, Buffer buffer,
                                 int tupindex, LVRelStats *vacrelstats)
 {
-       OffsetNumber unbuf[BLCKSZ / sizeof(OffsetNumber)];
-       OffsetNumber *unused = unbuf;
+       OffsetNumber unused[BLCKSZ / sizeof(OffsetNumber)];
        int                     uncnt;
        Page            page = BufferGetPage(buffer);
        ItemId          itemid;
@@ -524,8 +523,7 @@ lazy_vacuum_page(Relation onerel, BlockNumber blkno, Buffer buffer,
        {
                XLogRecPtr      recptr;
 
-               recptr = log_heap_clean(onerel, buffer, (char *) unused,
-                                                 (char *) (&(unused[uncnt])) - (char *) unused);
+               recptr = log_heap_clean(onerel, buffer, unused, uncnt);
                PageSetLSN(page, recptr);
                PageSetSUI(page, ThisStartUpID);
        }
index bae635cc635568fb61544c486c6fc7757ebe39af..06a0772bba81fda5f6de1c22cf36c1ba447db442 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: heapam.h,v 1.80 2003/02/13 05:35:11 momjian Exp $
+ * $Id: heapam.h,v 1.81 2003/02/23 20:32:12 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -173,7 +173,7 @@ extern void heap_redo(XLogRecPtr lsn, XLogRecord *rptr);
 extern void heap_undo(XLogRecPtr lsn, XLogRecord *rptr);
 extern void heap_desc(char *buf, uint8 xl_info, char *rec);
 extern XLogRecPtr log_heap_clean(Relation reln, Buffer buffer,
-                          char *unused, int unlen);
+                                                                OffsetNumber *unused, int uncnt);
 extern XLogRecPtr log_heap_move(Relation reln, Buffer oldbuf,
                          ItemPointerData from,
                          Buffer newbuf, HeapTuple newtup);