mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +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:
@@ -824,11 +824,16 @@ hashbucketcleanup(Relation rel, Bucket cur_bucket, Buffer bucket_buf,
|
||||
XLogRegisterData((char *) &xlrec, SizeOfHashDelete);
|
||||
|
||||
/*
|
||||
* bucket buffer needs to be registered to ensure that we can
|
||||
* acquire a cleanup lock on it during replay.
|
||||
* bucket buffer was not changed, but still needs to be
|
||||
* registered to ensure that we can acquire a cleanup lock on
|
||||
* it during replay.
|
||||
*/
|
||||
if (!xlrec.is_primary_bucket_page)
|
||||
XLogRegisterBuffer(0, bucket_buf, REGBUF_STANDARD | REGBUF_NO_IMAGE);
|
||||
{
|
||||
uint8 flags = REGBUF_STANDARD | REGBUF_NO_IMAGE | REGBUF_NO_CHANGE;
|
||||
|
||||
XLogRegisterBuffer(0, bucket_buf, flags);
|
||||
}
|
||||
|
||||
XLogRegisterBuffer(1, buf, REGBUF_STANDARD);
|
||||
XLogRegisterBufData(1, (char *) deletable,
|
||||
|
@@ -658,11 +658,15 @@ _hash_freeovflpage(Relation rel, Buffer bucketbuf, Buffer ovflbuf,
|
||||
XLogRegisterData((char *) &xlrec, SizeOfHashSqueezePage);
|
||||
|
||||
/*
|
||||
* bucket buffer needs to be registered to ensure that we can acquire
|
||||
* a cleanup lock on it during replay.
|
||||
* bucket buffer was not changed, but still needs to be registered to
|
||||
* ensure that we can acquire a cleanup lock on it during replay.
|
||||
*/
|
||||
if (!xlrec.is_prim_bucket_same_wrt)
|
||||
XLogRegisterBuffer(0, bucketbuf, REGBUF_STANDARD | REGBUF_NO_IMAGE);
|
||||
{
|
||||
uint8 flags = REGBUF_STANDARD | REGBUF_NO_IMAGE | REGBUF_NO_CHANGE;
|
||||
|
||||
XLogRegisterBuffer(0, bucketbuf, flags);
|
||||
}
|
||||
|
||||
XLogRegisterBuffer(1, wbuf, REGBUF_STANDARD);
|
||||
if (xlrec.ntups > 0)
|
||||
@@ -960,11 +964,16 @@ readpage:
|
||||
XLogRegisterData((char *) &xlrec, SizeOfHashMovePageContents);
|
||||
|
||||
/*
|
||||
* bucket buffer needs to be registered to ensure that
|
||||
* we can acquire a cleanup lock on it during replay.
|
||||
* bucket buffer was not changed, but still needs to
|
||||
* be registered to ensure that we can acquire a
|
||||
* cleanup lock on it during replay.
|
||||
*/
|
||||
if (!xlrec.is_prim_bucket_same_wrt)
|
||||
XLogRegisterBuffer(0, bucket_buf, REGBUF_STANDARD | REGBUF_NO_IMAGE);
|
||||
{
|
||||
int flags = REGBUF_STANDARD | REGBUF_NO_IMAGE | REGBUF_NO_CHANGE;
|
||||
|
||||
XLogRegisterBuffer(0, bucket_buf, flags);
|
||||
}
|
||||
|
||||
XLogRegisterBuffer(1, wbuf, REGBUF_STANDARD);
|
||||
XLogRegisterBufData(1, (char *) itup_offsets,
|
||||
|
Reference in New Issue
Block a user