From 13dadef8b5336df1b4309f1d8c1a96a109a4b5dd Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 23 Feb 2003 20:32:12 +0000 Subject: [PATCH] Improve coding of log_heap_clean() and heap_xlog_clean(). --- src/backend/access/heap/heapam.c | 47 +++++++++++++++---------------- src/backend/commands/vacuum.c | 14 ++++----- src/backend/commands/vacuumlazy.c | 8 ++---- src/include/access/heapam.h | 4 +-- 4 files changed, 33 insertions(+), 40 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index cb0c28c778..7ef0bf2d55 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -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; diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index ac45a5df69..ad79d0923e 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -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); } diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index 9790ef30bc..00bd905add 100644 --- a/src/backend/commands/vacuumlazy.c +++ b/src/backend/commands/vacuumlazy.c @@ -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); } diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h index bae635cc63..06a0772bba 100644 --- a/src/include/access/heapam.h +++ b/src/include/access/heapam.h @@ -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);