mirror of
https://github.com/postgres/postgres.git
synced 2025-08-18 12:22:09 +03:00
Back-patch log_newpage_range().
Back-patch a subset of commit 9155580fd5
to v11, v10, 9.6, and 9.5. Include the latest repairs to this function.
Use a new XLOG_FPI_MULTI value instead of reusing XLOG_FPI. That way,
if an older server reads WAL from this function, that server will PANIC
instead of applying just one page of the record. The next commit adds a
call to this function.
Discussion: https://postgr.es/m/20200304.162919.898938381201316571.horikyota.ntt@gmail.com
This commit is contained in:
@@ -9754,7 +9754,7 @@ xlog_redo(XLogReaderState *record)
|
||||
|
||||
/* in XLOG rmgr, backup blocks are only used by XLOG_FPI records */
|
||||
Assert(info == XLOG_FPI || info == XLOG_FPI_FOR_HINT ||
|
||||
!XLogRecHasAnyBlockRefs(record));
|
||||
info == XLOG_FPI_MULTI || !XLogRecHasAnyBlockRefs(record));
|
||||
|
||||
if (info == XLOG_NEXTOID)
|
||||
{
|
||||
@@ -9957,14 +9957,16 @@ xlog_redo(XLogReaderState *record)
|
||||
{
|
||||
/* nothing to do here */
|
||||
}
|
||||
else if (info == XLOG_FPI || info == XLOG_FPI_FOR_HINT)
|
||||
else if (info == XLOG_FPI || info == XLOG_FPI_FOR_HINT ||
|
||||
info == XLOG_FPI_MULTI)
|
||||
{
|
||||
Buffer buffer;
|
||||
uint8 block_id;
|
||||
|
||||
/*
|
||||
* Full-page image (FPI) records contain nothing else but a backup
|
||||
* block. The block reference must include a full-page image -
|
||||
* otherwise there would be no point in this record.
|
||||
* block (or multiple backup blocks). Every block reference must
|
||||
* include a full-page image - otherwise there would be no point in
|
||||
* this record.
|
||||
*
|
||||
* No recovery conflicts are generated by these generic records - if a
|
||||
* resource manager needs to generate conflicts, it has to define a
|
||||
@@ -9976,9 +9978,14 @@ xlog_redo(XLogReaderState *record)
|
||||
* XLOG_FPI and XLOG_FPI_FOR_HINT records, they use a different info
|
||||
* code just to distinguish them for statistics purposes.
|
||||
*/
|
||||
if (XLogReadBufferForRedo(record, 0, &buffer) != BLK_RESTORED)
|
||||
elog(ERROR, "unexpected XLogReadBufferForRedo result when restoring backup block");
|
||||
UnlockReleaseBuffer(buffer);
|
||||
for (block_id = 0; block_id <= record->max_block_id; block_id++)
|
||||
{
|
||||
Buffer buffer;
|
||||
|
||||
if (XLogReadBufferForRedo(record, block_id, &buffer) != BLK_RESTORED)
|
||||
elog(ERROR, "unexpected XLogReadBufferForRedo result when restoring backup block");
|
||||
UnlockReleaseBuffer(buffer);
|
||||
}
|
||||
}
|
||||
else if (info == XLOG_BACKUP_END)
|
||||
{
|
||||
|
Reference in New Issue
Block a user