Improve coding of log_heap_clean() and heap_xlog_clean().
This commit is contained in:
parent
88dc31e3f2
commit
13dadef8b5
|
@ -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;
|
||||
rdata[1].data = unused;
|
||||
rdata[1].len = unlen;
|
||||
rdata[1].next = &(rdata[2]);
|
||||
if (uncnt > 0)
|
||||
{
|
||||
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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue