@ -970,19 +970,6 @@ begin:;
}
}
}
}
/*
* If we backed up any full blocks and online backup is not in progress ,
* mark the backup blocks as removable . This allows the WAL archiver to
* know whether it is safe to compress archived WAL data by transforming
* full - block records into the non - full - block format .
*
* Note : we could just set the flag whenever ! forcePageWrites , but
* defining it like this leaves the info bit free for some potential other
* use in records without any backup blocks .
*/
if ( ( info & XLR_BKP_BLOCK_MASK ) & & ! Insert - > forcePageWrites )
info | = XLR_BKP_REMOVABLE ;
/*
/*
* If there isn ' t enough space on the current XLOG page for a record
* If there isn ' t enough space on the current XLOG page for a record
* header , advance to the next page ( leaving the unused space as zeroes ) .
* header , advance to the next page ( leaving the unused space as zeroes ) .
@ -1601,6 +1588,21 @@ AdvanceXLInsertBuffer(bool new_segment)
NewPage - > xlp_pageaddr . xlogid = NewPageEndPtr . xlogid ;
NewPage - > xlp_pageaddr . xlogid = NewPageEndPtr . xlogid ;
NewPage - > xlp_pageaddr . xrecoff = NewPageEndPtr . xrecoff - XLOG_BLCKSZ ;
NewPage - > xlp_pageaddr . xrecoff = NewPageEndPtr . xrecoff - XLOG_BLCKSZ ;
/*
* If online backup is not in progress , mark the header to indicate that
* WAL records beginning in this page have removable backup blocks . This
* allows the WAL archiver to know whether it is safe to compress archived
* WAL data by transforming full - block records into the non - full - block
* format . It is sufficient to record this at the page level because we
* force a page switch ( in fact a segment switch ) when starting a backup ,
* so the flag will be off before any records can be written during the
* backup . At the end of a backup , the last page will be marked as all
* unsafe when perhaps only part is unsafe , but at worst the archiver
* would miss the opportunity to compress a few records .
*/
if ( ! Insert - > forcePageWrites )
NewPage - > xlp_info | = XLP_BKP_REMOVABLE ;
/*
/*
* If first page of an XLOG segment file , make it a long header .
* If first page of an XLOG segment file , make it a long header .
*/
*/
@ -8849,19 +8851,6 @@ do_pg_start_backup(const char *backupidstr, bool fast, char **labelfile)
errmsg ( " backup label too long (max %d bytes) " ,
errmsg ( " backup label too long (max %d bytes) " ,
MAXPGPATH ) ) ) ;
MAXPGPATH ) ) ) ;
/*
* Force an XLOG file switch before the checkpoint , to ensure that the WAL
* segment the checkpoint is written to doesn ' t contain pages with old
* timeline IDs . That would otherwise happen if you called
* pg_start_backup ( ) right after restoring from a PITR archive : the first
* WAL segment containing the startup checkpoint has pages in the
* beginning with the old timeline ID . That can cause trouble at recovery :
* we won ' t have a history file covering the old timeline if pg_xlog
* directory was not included in the base backup and the WAL archive was
* cleared too before starting the backup .
*/
RequestXLogSwitch ( ) ;
/*
/*
* Mark backup active in shared memory . We must do full - page WAL writes
* Mark backup active in shared memory . We must do full - page WAL writes
* during an on - line backup even if not doing so at other times , because
* during an on - line backup even if not doing so at other times , because
@ -8902,6 +8891,25 @@ do_pg_start_backup(const char *backupidstr, bool fast, char **labelfile)
{
{
bool gotUniqueStartpoint = false ;
bool gotUniqueStartpoint = false ;
/*
* Force an XLOG file switch before the checkpoint , to ensure that the
* WAL segment the checkpoint is written to doesn ' t contain pages with
* old timeline IDs . That would otherwise happen if you called
* pg_start_backup ( ) right after restoring from a PITR archive : the
* first WAL segment containing the startup checkpoint has pages in
* the beginning with the old timeline ID . That can cause trouble at
* recovery : we won ' t have a history file covering the old timeline if
* pg_xlog directory was not included in the base backup and the WAL
* archive was cleared too before starting the backup .
*
* This also ensures that we have emitted a WAL page header that has
* XLP_BKP_REMOVABLE off before we emit the checkpoint record .
* Therefore , if a WAL archiver ( such as pglesslog ) is trying to
* compress out removable backup blocks , it won ' t remove any that
* occur after this point .
*/
RequestXLogSwitch ( ) ;
do
do
{
{
/*
/*