1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-30 21:42:05 +03:00

Distinguish XLOG_FPI records generated for hint-bit updates.

Add a new XLOG_FPI_FOR_HINT record type, and use that for full-page images
generated for hint bit updates, when checksums are enabled. The new record
type is replayed exactly the same as XLOG_FPI, but allows them to be tallied
separately e.g. in pg_xlogdump.
This commit is contained in:
Heikki Linnakangas
2014-11-24 10:43:32 +02:00
parent e2dc3f5772
commit 0bd624d63b
5 changed files with 19 additions and 10 deletions

View File

@ -8545,7 +8545,8 @@ xlog_redo(XLogReaderState *record)
XLogRecPtr lsn = record->EndRecPtr;
/* in XLOG rmgr, backup blocks are only used by XLOG_FPI records */
Assert(!XLogRecHasAnyBlockRefs(record) || info == XLOG_FPI);
Assert(info == XLOG_FPI || info == XLOG_FPI_FOR_HINT ||
!XLogRecHasAnyBlockRefs(record));
if (info == XLOG_NEXTOID)
{
@ -8730,7 +8731,7 @@ xlog_redo(XLogReaderState *record)
{
/* nothing to do here */
}
else if (info == XLOG_FPI)
else if (info == XLOG_FPI || info == XLOG_FPI_FOR_HINT)
{
Buffer buffer;
@ -8739,12 +8740,15 @@ xlog_redo(XLogReaderState *record)
* block. The block reference must include a full-page image -
* otherwise there would be no point in this record.
*
* Since the only change in these backup block are hint bits, there
* are no recovery conflicts generated.
* No recovery conflicts are generated by these generic records - if a
* resource manager needs to generate conflicts, it has to define a
* separate WAL record type and redo routine.
*
* This also means there is no corresponding API call for this, so an
* smgr implementation has no need to implement anything. Which means
* nothing is needed in md.c etc
* XLOG_FPI_FOR_HINT records are generated when a page needs to be
* WAL- logged because of a hint bit update. They are only generated
* when checksums are enabled. There is no difference in handling
* 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");