mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Use REGBUF_NO_CHANGE at one more place in the hash index.
Commit 00d7fb5e2e
started to use REGBUF_NO_CHANGE at a few places in the
code where we register the buffer before marking it dirty but missed
updating one of the code flows in the hash index where we free the overflow
page without any live tuples on it.
Author: Amit Kapila and Hayato Kuroda
Discussion: http://postgr.es/m/f045c8f7-ee24-ead6-3679-c04a43d21351@gmail.com
This commit is contained in:
@@ -655,7 +655,10 @@ hash_xlog_squeeze_page(XLogReaderState *record)
|
||||
*/
|
||||
(void) XLogReadBufferForRedoExtended(record, 0, RBM_NORMAL, true, &bucketbuf);
|
||||
|
||||
action = XLogReadBufferForRedo(record, 1, &writebuf);
|
||||
if (xldata->ntups > 0 || xldata->is_prev_bucket_same_wrt)
|
||||
action = XLogReadBufferForRedo(record, 1, &writebuf);
|
||||
else
|
||||
action = BLK_NOTFOUND;
|
||||
}
|
||||
|
||||
/* replay the record for adding entries in overflow buffer */
|
||||
|
@@ -668,14 +668,31 @@ _hash_freeovflpage(Relation rel, Buffer bucketbuf, Buffer ovflbuf,
|
||||
XLogRegisterBuffer(0, bucketbuf, flags);
|
||||
}
|
||||
|
||||
XLogRegisterBuffer(1, wbuf, REGBUF_STANDARD);
|
||||
if (xlrec.ntups > 0)
|
||||
{
|
||||
XLogRegisterBuffer(1, wbuf, REGBUF_STANDARD);
|
||||
XLogRegisterBufData(1, (char *) itup_offsets,
|
||||
nitups * sizeof(OffsetNumber));
|
||||
for (i = 0; i < nitups; i++)
|
||||
XLogRegisterBufData(1, (char *) itups[i], tups_size[i]);
|
||||
}
|
||||
else if (xlrec.is_prim_bucket_same_wrt || xlrec.is_prev_bucket_same_wrt)
|
||||
{
|
||||
uint8 wbuf_flags;
|
||||
|
||||
/*
|
||||
* A write buffer needs to be registered even if no tuples are
|
||||
* added to it to ensure that we can acquire a cleanup lock on it
|
||||
* if it is the same as primary bucket buffer or update the
|
||||
* nextblkno if it is same as the previous bucket buffer.
|
||||
*/
|
||||
Assert(xlrec.ntups == 0);
|
||||
|
||||
wbuf_flags = REGBUF_STANDARD;
|
||||
if (!xlrec.is_prev_bucket_same_wrt)
|
||||
wbuf_flags |= REGBUF_NO_CHANGE;
|
||||
XLogRegisterBuffer(1, wbuf, wbuf_flags);
|
||||
}
|
||||
|
||||
XLogRegisterBuffer(2, ovflbuf, REGBUF_STANDARD);
|
||||
|
||||
|
Reference in New Issue
Block a user