Commit 13dadef8 authored by Tom Lane's avatar Tom Lane

Improve coding of log_heap_clean() and heap_xlog_clean().

parent 88dc31e3
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * INTERFACE ROUTINES
...@@ -1891,36 +1891,40 @@ heap_restrpos(HeapScanDesc scan) ...@@ -1891,36 +1891,40 @@ heap_restrpos(HeapScanDesc scan)
} }
XLogRecPtr 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; xl_heap_clean xlrec;
XLogRecPtr recptr; XLogRecPtr recptr;
XLogRecData rdata[3]; XLogRecData rdata[2];
/* Caller should not call me on a temp relation */ /* Caller should not call me on a temp relation */
Assert(!reln->rd_istemp); Assert(!reln->rd_istemp);
xlrec.node = reln->rd_node; xlrec.node = reln->rd_node;
xlrec.block = BufferGetBlockNumber(buffer); xlrec.block = BufferGetBlockNumber(buffer);
rdata[0].buffer = InvalidBuffer; rdata[0].buffer = InvalidBuffer;
rdata[0].data = (char *) &xlrec; rdata[0].data = (char *) &xlrec;
rdata[0].len = SizeOfHeapClean; rdata[0].len = SizeOfHeapClean;
rdata[0].next = &(rdata[1]); 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; rdata[1].buffer = buffer;
rdata[1].data = unused; if (uncnt > 0)
rdata[1].len = unlen; {
rdata[1].next = &(rdata[2]); rdata[1].data = (char *) unused;
rdata[1].len = uncnt * sizeof(OffsetNumber);
} }
else else
rdata[0].next = &(rdata[2]); {
rdata[1].data = NULL;
rdata[2].buffer = buffer; rdata[1].len = 0;
rdata[2].data = NULL; }
rdata[2].len = 0; rdata[1].next = NULL;
rdata[2].next = NULL;
recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_CLEAN, rdata); recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_CLEAN, rdata);
...@@ -2032,7 +2036,6 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record) ...@@ -2032,7 +2036,6 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record)
return; return;
reln = XLogOpenRelation(redo, RM_HEAP_ID, xlrec->node); reln = XLogOpenRelation(redo, RM_HEAP_ID, xlrec->node);
if (!RelationIsValid(reln)) if (!RelationIsValid(reln))
return; return;
...@@ -2052,18 +2055,14 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record) ...@@ -2052,18 +2055,14 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record)
if (record->xl_len > SizeOfHeapClean) if (record->xl_len > SizeOfHeapClean)
{ {
OffsetNumber unbuf[BLCKSZ / sizeof(OffsetNumber)]; OffsetNumber *unused;
OffsetNumber *unused = unbuf; OffsetNumber *unend;
char *unend;
ItemId lp; ItemId lp;
Assert((record->xl_len - SizeOfHeapClean) <= BLCKSZ); unused = (OffsetNumber *) ((char *) xlrec + SizeOfHeapClean);
memcpy((char *) unbuf, unend = (OffsetNumber *) ((char *) xlrec + record->xl_len);
(char *) xlrec + SizeOfHeapClean,
record->xl_len - SizeOfHeapClean);
unend = (char *) unbuf + (record->xl_len - SizeOfHeapClean);
while ((char *) unused < unend) while (unused < unend)
{ {
lp = PageGetItemId(page, *unused + 1); lp = PageGetItemId(page, *unused + 1);
lp->lp_flags &= ~LP_USED; lp->lp_flags &= ~LP_USED;
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* *
* *
* IDENTIFICATION * 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, ...@@ -2386,8 +2386,7 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
if (vacpage->blkno == (blkno - 1) && if (vacpage->blkno == (blkno - 1) &&
vacpage->offsets_free > 0) vacpage->offsets_free > 0)
{ {
OffsetNumber unbuf[BLCKSZ / sizeof(OffsetNumber)]; OffsetNumber unused[BLCKSZ / sizeof(OffsetNumber)];
OffsetNumber *unused = unbuf;
int uncnt; int uncnt;
buf = ReadBuffer(onerel, vacpage->blkno); buf = ReadBuffer(onerel, vacpage->blkno);
...@@ -2430,8 +2429,7 @@ repair_frag(VRelStats *vacrelstats, Relation onerel, ...@@ -2430,8 +2429,7 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
{ {
XLogRecPtr recptr; XLogRecPtr recptr;
recptr = log_heap_clean(onerel, buf, (char *) unused, recptr = log_heap_clean(onerel, buf, unused, uncnt);
(char *) (&(unused[uncnt])) - (char *) unused);
PageSetLSN(page, recptr); PageSetLSN(page, recptr);
PageSetSUI(page, ThisStartUpID); PageSetSUI(page, ThisStartUpID);
} }
...@@ -2555,8 +2553,7 @@ vacuum_heap(VRelStats *vacrelstats, Relation onerel, VacPageList vacuum_pages) ...@@ -2555,8 +2553,7 @@ vacuum_heap(VRelStats *vacrelstats, Relation onerel, VacPageList vacuum_pages)
static void static void
vacuum_page(Relation onerel, Buffer buffer, VacPage vacpage) vacuum_page(Relation onerel, Buffer buffer, VacPage vacpage)
{ {
OffsetNumber unbuf[BLCKSZ / sizeof(OffsetNumber)]; OffsetNumber unused[BLCKSZ / sizeof(OffsetNumber)];
OffsetNumber *unused = unbuf;
int uncnt; int uncnt;
Page page = BufferGetPage(buffer); Page page = BufferGetPage(buffer);
ItemId itemid; ItemId itemid;
...@@ -2580,8 +2577,7 @@ vacuum_page(Relation onerel, Buffer buffer, VacPage vacpage) ...@@ -2580,8 +2577,7 @@ vacuum_page(Relation onerel, Buffer buffer, VacPage vacpage)
{ {
XLogRecPtr recptr; XLogRecPtr recptr;
recptr = log_heap_clean(onerel, buffer, (char *) unused, recptr = log_heap_clean(onerel, buffer, unused, uncnt);
(char *) (&(unused[uncnt])) - (char *) unused);
PageSetLSN(page, recptr); PageSetLSN(page, recptr);
PageSetSUI(page, ThisStartUpID); PageSetSUI(page, ThisStartUpID);
} }
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
* *
* *
* IDENTIFICATION * 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 ...@@ -497,8 +497,7 @@ static int
lazy_vacuum_page(Relation onerel, BlockNumber blkno, Buffer buffer, lazy_vacuum_page(Relation onerel, BlockNumber blkno, Buffer buffer,
int tupindex, LVRelStats *vacrelstats) int tupindex, LVRelStats *vacrelstats)
{ {
OffsetNumber unbuf[BLCKSZ / sizeof(OffsetNumber)]; OffsetNumber unused[BLCKSZ / sizeof(OffsetNumber)];
OffsetNumber *unused = unbuf;
int uncnt; int uncnt;
Page page = BufferGetPage(buffer); Page page = BufferGetPage(buffer);
ItemId itemid; ItemId itemid;
...@@ -524,8 +523,7 @@ lazy_vacuum_page(Relation onerel, BlockNumber blkno, Buffer buffer, ...@@ -524,8 +523,7 @@ lazy_vacuum_page(Relation onerel, BlockNumber blkno, Buffer buffer,
{ {
XLogRecPtr recptr; XLogRecPtr recptr;
recptr = log_heap_clean(onerel, buffer, (char *) unused, recptr = log_heap_clean(onerel, buffer, unused, uncnt);
(char *) (&(unused[uncnt])) - (char *) unused);
PageSetLSN(page, recptr); PageSetLSN(page, recptr);
PageSetSUI(page, ThisStartUpID); PageSetSUI(page, ThisStartUpID);
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * 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); ...@@ -173,7 +173,7 @@ extern void heap_redo(XLogRecPtr lsn, XLogRecord *rptr);
extern void heap_undo(XLogRecPtr lsn, XLogRecord *rptr); extern void heap_undo(XLogRecPtr lsn, XLogRecord *rptr);
extern void heap_desc(char *buf, uint8 xl_info, char *rec); extern void heap_desc(char *buf, uint8 xl_info, char *rec);
extern XLogRecPtr log_heap_clean(Relation reln, Buffer buffer, 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, extern XLogRecPtr log_heap_move(Relation reln, Buffer oldbuf,
ItemPointerData from, ItemPointerData from,
Buffer newbuf, HeapTuple newtup); Buffer newbuf, HeapTuple newtup);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment