@ -6921,133 +6921,6 @@ log_heap_update(Relation reln, Buffer oldbuf,
return recptr ;
}
/*
* Perform XLogInsert of a HEAP_NEWPAGE record to WAL . Caller is responsible
* for writing the page to disk after calling this routine .
*
* Note : If you ' re using this function , you should be building pages in private
* memory and writing them directly to smgr . If you ' re using buffers , call
* log_newpage_buffer instead .
*
* If the page follows the standard page layout , with a PageHeader and unused
* space between pd_lower and pd_upper , set ' page_std ' to TRUE . That allows
* the unused space to be left out from the WAL record , making it smaller .
*/
XLogRecPtr
log_newpage ( RelFileNode * rnode , ForkNumber forkNum , BlockNumber blkno ,
Page page , bool page_std )
{
xl_heap_newpage xlrec ;
XLogRecPtr recptr ;
XLogRecData rdata [ 3 ] ;
/*
* Note : the NEWPAGE log record is used for both heaps and indexes , so do
* not do anything that assumes we are touching a heap .
*/
/* NO ELOG(ERROR) from here till newpage op is logged */
START_CRIT_SECTION ( ) ;
xlrec . node = * rnode ;
xlrec . forknum = forkNum ;
xlrec . blkno = blkno ;
if ( page_std )
{
/* Assume we can omit data between pd_lower and pd_upper */
uint16 lower = ( ( PageHeader ) page ) - > pd_lower ;
uint16 upper = ( ( PageHeader ) page ) - > pd_upper ;
if ( lower > = SizeOfPageHeaderData & &
upper > lower & &
upper < = BLCKSZ )
{
xlrec . hole_offset = lower ;
xlrec . hole_length = upper - lower ;
}
else
{
/* No "hole" to compress out */
xlrec . hole_offset = 0 ;
xlrec . hole_length = 0 ;
}
}
else
{
/* Not a standard page header, don't try to eliminate "hole" */
xlrec . hole_offset = 0 ;
xlrec . hole_length = 0 ;
}
rdata [ 0 ] . data = ( char * ) & xlrec ;
rdata [ 0 ] . len = SizeOfHeapNewpage ;
rdata [ 0 ] . buffer = InvalidBuffer ;
rdata [ 0 ] . next = & ( rdata [ 1 ] ) ;
if ( xlrec . hole_length = = 0 )
{
rdata [ 1 ] . data = ( char * ) page ;
rdata [ 1 ] . len = BLCKSZ ;
rdata [ 1 ] . buffer = InvalidBuffer ;
rdata [ 1 ] . next = NULL ;
}
else
{
/* must skip the hole */
rdata [ 1 ] . data = ( char * ) page ;
rdata [ 1 ] . len = xlrec . hole_offset ;
rdata [ 1 ] . buffer = InvalidBuffer ;
rdata [ 1 ] . next = & rdata [ 2 ] ;
rdata [ 2 ] . data = ( char * ) page + ( xlrec . hole_offset + xlrec . hole_length ) ;
rdata [ 2 ] . len = BLCKSZ - ( xlrec . hole_offset + xlrec . hole_length ) ;
rdata [ 2 ] . buffer = InvalidBuffer ;
rdata [ 2 ] . next = NULL ;
}
recptr = XLogInsert ( RM_HEAP_ID , XLOG_HEAP_NEWPAGE , rdata ) ;
/*
* The page may be uninitialized . If so , we can ' t set the LSN because that
* would corrupt the page .
*/
if ( ! PageIsNew ( page ) )
{
PageSetLSN ( page , recptr ) ;
}
END_CRIT_SECTION ( ) ;
return recptr ;
}
/*
* Perform XLogInsert of a HEAP_NEWPAGE record to WAL .
*
* Caller should initialize the buffer and mark it dirty before calling this
* function . This function will set the page LSN and TLI .
*
* If the page follows the standard page layout , with a PageHeader and unused
* space between pd_lower and pd_upper , set ' page_std ' to TRUE . That allows
* the unused space to be left out from the WAL record , making it smaller .
*/
XLogRecPtr
log_newpage_buffer ( Buffer buffer , bool page_std )
{
Page page = BufferGetPage ( buffer ) ;
RelFileNode rnode ;
ForkNumber forkNum ;
BlockNumber blkno ;
/* Shared buffers should be modified in a critical section. */
Assert ( CritSectionCount > 0 ) ;
BufferGetTag ( buffer , & rnode , & forkNum , & blkno ) ;
return log_newpage ( & rnode , forkNum , blkno , page , page_std ) ;
}
/*
* Perform XLogInsert of a XLOG_HEAP2_NEW_CID record
*
@ -7515,56 +7388,6 @@ heap_xlog_freeze_page(XLogRecPtr lsn, XLogRecord *record)
UnlockReleaseBuffer ( buffer ) ;
}
static void
heap_xlog_newpage ( XLogRecPtr lsn , XLogRecord * record )
{
xl_heap_newpage * xlrec = ( xl_heap_newpage * ) XLogRecGetData ( record ) ;
char * blk = ( ( char * ) xlrec ) + sizeof ( xl_heap_newpage ) ;
Buffer buffer ;
Page page ;
/* Backup blocks are not used in newpage records */
Assert ( ! ( record - > xl_info & XLR_BKP_BLOCK_MASK ) ) ;
Assert ( record - > xl_len = = SizeOfHeapNewpage + BLCKSZ - xlrec - > hole_length ) ;
/*
* Note : the NEWPAGE log record is used for both heaps and indexes , so do
* not do anything that assumes we are touching a heap .
*/
buffer = XLogReadBufferExtended ( xlrec - > node , xlrec - > forknum , xlrec - > blkno ,
RBM_ZERO ) ;
Assert ( BufferIsValid ( buffer ) ) ;
LockBuffer ( buffer , BUFFER_LOCK_EXCLUSIVE ) ;
page = ( Page ) BufferGetPage ( buffer ) ;
if ( xlrec - > hole_length = = 0 )
{
memcpy ( ( char * ) page , blk , BLCKSZ ) ;
}
else
{
memcpy ( ( char * ) page , blk , xlrec - > hole_offset ) ;
/* must zero-fill the hole */
MemSet ( ( char * ) page + xlrec - > hole_offset , 0 , xlrec - > hole_length ) ;
memcpy ( ( char * ) page + ( xlrec - > hole_offset + xlrec - > hole_length ) ,
blk + xlrec - > hole_offset ,
BLCKSZ - ( xlrec - > hole_offset + xlrec - > hole_length ) ) ;
}
/*
* The page may be uninitialized . If so , we can ' t set the LSN because that
* would corrupt the page .
*/
if ( ! PageIsNew ( page ) )
{
PageSetLSN ( page , lsn ) ;
}
MarkBufferDirty ( buffer ) ;
UnlockReleaseBuffer ( buffer ) ;
}
/*
* Given an " infobits " field from an XLog record , set the correct bits in the
* given infomask and infomask2 for the tuple touched by the record .
@ -8421,9 +8244,6 @@ heap_redo(XLogRecPtr lsn, XLogRecord *record)
case XLOG_HEAP_HOT_UPDATE :
heap_xlog_update ( lsn , record , true ) ;
break ;
case XLOG_HEAP_NEWPAGE :
heap_xlog_newpage ( lsn , record ) ;
break ;
case XLOG_HEAP_LOCK :
heap_xlog_lock ( lsn , record ) ;
break ;