88 *
99 *
1010 * IDENTIFICATION
11- * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.104 2000/12/30 06:52:33 vadim Exp $
11+ * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.105 2000/12/30 15:19:54 vadim Exp $
1212 *
1313 *
1414 * INTERFACE ROUTINES
9090
9191XLogRecPtr log_heap_move (Relation reln , Buffer oldbuf , ItemPointerData from ,
9292 Buffer newbuf , HeapTuple newtup );
93- XLogRecPtr log_heap_clean (Relation reln , Buffer buffer );
93+ XLogRecPtr log_heap_clean (Relation reln , Buffer buffer ,
94+ char * unused , int unlen );
9495
9596/* comments are in heap_update */
9697static xl_heaptid _locked_tuple_ ;
@@ -2002,11 +2003,11 @@ heap_restrpos(HeapScanDesc scan)
20022003}
20032004
20042005XLogRecPtr
2005- log_heap_clean (Relation reln , Buffer buffer )
2006+ log_heap_clean (Relation reln , Buffer buffer , char * unused , int unlen )
20062007{
20072008 xl_heap_clean xlrec ;
20082009 XLogRecPtr recptr ;
2009- XLogRecData rdata [2 ];
2010+ XLogRecData rdata [3 ];
20102011
20112012 xlrec .node = reln -> rd_node ;
20122013 xlrec .block = BufferGetBlockNumber (buffer );
@@ -2015,10 +2016,20 @@ log_heap_clean(Relation reln, Buffer buffer)
20152016 rdata [0 ].len = SizeOfHeapClean ;
20162017 rdata [0 ].next = & (rdata [1 ]);
20172018
2018- rdata [1 ].buffer = buffer ;
2019- rdata [1 ].data = NULL ;
2020- rdata [1 ].len = 0 ;
2021- rdata [1 ].next = NULL ;
2019+ if (unlen > 0 )
2020+ {
2021+ rdata [1 ].buffer = buffer ;
2022+ rdata [1 ].data = unused ;
2023+ rdata [1 ].len = unlen ;
2024+ rdata [1 ].next = & (rdata [2 ]);
2025+ }
2026+ else
2027+ rdata [0 ].next = & (rdata [2 ]);
2028+
2029+ rdata [2 ].buffer = buffer ;
2030+ rdata [2 ].data = NULL ;
2031+ rdata [2 ].len = 0 ;
2032+ rdata [2 ].next = NULL ;
20222033
20232034 recptr = XLogInsert (RM_HEAP_ID , XLOG_HEAP_CLEAN , rdata );
20242035
@@ -2102,14 +2113,10 @@ log_heap_move(Relation reln, Buffer oldbuf, ItemPointerData from,
21022113static void
21032114heap_xlog_clean (bool redo , XLogRecPtr lsn , XLogRecord * record )
21042115{
2105- xl_heap_clean * xlrec = (xl_heap_clean * ) XLogRecGetData (record );
2116+ xl_heap_clean * xlrec = (xl_heap_clean * ) XLogRecGetData (record );
21062117 Relation reln ;
21072118 Buffer buffer ;
21082119 Page page ;
2109- OffsetNumber maxoff ;
2110- OffsetNumber offnum ;
2111- HeapTupleHeader htup ;
2112- ItemId lp ;
21132120
21142121 if (!redo || (record -> xl_info & XLR_BKP_BLOCK_1 ))
21152122 return ;
@@ -2133,23 +2140,25 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record)
21332140 return ;
21342141 }
21352142
2136- maxoff = PageGetMaxOffsetNumber (page );
2137- for (offnum = FirstOffsetNumber ;
2138- offnum <= maxoff ;
2139- offnum = OffsetNumberNext (offnum ))
2143+ if (record -> xl_len > SizeOfHeapClean )
21402144 {
2141- lp = PageGetItemId ( page , offnum ) ;
2142-
2143- if (! ItemIdIsUsed ( lp ))
2144- continue ;
2145+ char unbuf [ BLCKSZ ] ;
2146+ OffsetNumber * unused = ( OffsetNumber * ) unbuf ;
2147+ char * unend ;
2148+ ItemId lp ;
21452149
2146- htup = (HeapTupleHeader ) PageGetItem (page , lp );
2150+ memcpy (unbuf , (char * )xlrec + SizeOfHeapClean , record -> xl_len - SizeOfHeapClean );
2151+ unend = unbuf + (record -> xl_len - SizeOfHeapClean );
21472152
2148- if (!HeapTupleSatisfiesNow (htup ))
2153+ while ((char * )unused < unend )
2154+ {
2155+ lp = ((PageHeader ) page )-> pd_linp + * unused ;
21492156 lp -> lp_flags &= ~LP_USED ;
2157+ unused ++ ;
2158+ }
21502159 }
21512160
2152- PageRepairFragmentation (page );
2161+ PageRepairFragmentation (page , NULL );
21532162 UnlockAndWriteBuffer (buffer );
21542163}
21552164
@@ -2247,7 +2256,10 @@ heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record)
22472256 uint32 newlen ;
22482257
22492258 if (record -> xl_info & XLOG_HEAP_INIT_PAGE )
2259+ {
22502260 PageInit (page , BufferGetPageSize (buffer ), 0 );
2261+ PageZero (page );
2262+ }
22512263
22522264 if (XLByteLE (lsn , PageGetLSN (page ))) /* changes are applied */
22532265 {
@@ -2401,7 +2413,10 @@ newsame:;
24012413 uint32 newlen ;
24022414
24032415 if (record -> xl_info & XLOG_HEAP_INIT_PAGE )
2416+ {
24042417 PageInit (page , BufferGetPageSize (buffer ), 0 );
2418+ PageZero (page );
2419+ }
24052420
24062421 if (XLByteLE (lsn , PageGetLSN (page ))) /* changes are applied */
24072422 {
@@ -2583,6 +2598,12 @@ heap_desc(char *buf, uint8 xl_info, char* rec)
25832598 ItemPointerGetBlockNumber (& (xlrec -> newtid )),
25842599 ItemPointerGetOffsetNumber (& (xlrec -> newtid )));
25852600 }
2601+ else if (info == XLOG_HEAP_CLEAN )
2602+ {
2603+ xl_heap_clean * xlrec = (xl_heap_clean * ) rec ;
2604+ sprintf (buf + strlen (buf ), "clean: node %u/%u; blk %u" ,
2605+ xlrec -> node .tblNode , xlrec -> node .relNode , xlrec -> block );
2606+ }
25862607 else
25872608 strcat (buf , "UNKNOWN" );
25882609}
0 commit comments