mirror of
https://github.com/postgres/postgres.git
synced 2025-12-21 05:21:08 +03:00
Assert that buffers are marked dirty before XLogRegisterBuffer().
Enforce the rule from transam/README in XLogRegisterBuffer(), and update callers to follow the rule. Hash indexes sometimes register clean pages as a part of the locking protocol, so provide a REGBUF_NO_CHANGE flag to support that use. Discussion: https://postgr.es/m/c84114f8-c7f1-5b57-f85a-3adc31e1a904@iki.fi Reviewed-by: Heikki Linnakangas
This commit is contained in:
@@ -248,6 +248,20 @@ XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
|
||||
Assert(!((flags & REGBUF_FORCE_IMAGE) && (flags & (REGBUF_NO_IMAGE))));
|
||||
Assert(begininsert_called);
|
||||
|
||||
/*
|
||||
* Ordinarily, buffer should be exclusive-locked and marked dirty before
|
||||
* we get here, otherwise we could end up violating one of the rules in
|
||||
* access/transam/README.
|
||||
*
|
||||
* Some callers intentionally register a clean page and never update that
|
||||
* page's LSN; in that case they can pass the flag REGBUF_NO_CHANGE to
|
||||
* bypass these checks.
|
||||
*/
|
||||
#ifdef USE_ASSERT_CHECKING
|
||||
if (!(flags & REGBUF_NO_CHANGE))
|
||||
Assert(BufferIsExclusiveLocked(buffer) && BufferIsDirty(buffer));
|
||||
#endif
|
||||
|
||||
if (block_id >= max_registered_block_id)
|
||||
{
|
||||
if (block_id >= max_registered_buffers)
|
||||
@@ -1313,8 +1327,8 @@ log_newpage_range(Relation rel, ForkNumber forknum,
|
||||
START_CRIT_SECTION();
|
||||
for (i = 0; i < nbufs; i++)
|
||||
{
|
||||
XLogRegisterBuffer(i, bufpack[i], flags);
|
||||
MarkBufferDirty(bufpack[i]);
|
||||
XLogRegisterBuffer(i, bufpack[i], flags);
|
||||
}
|
||||
|
||||
recptr = XLogInsert(RM_XLOG_ID, XLOG_FPI);
|
||||
|
||||
Reference in New Issue
Block a user