diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/access/hash/hash_xlog.c | 5 | ||||
-rw-r--r-- | src/backend/access/hash/hashovfl.c | 19 |
2 files changed, 22 insertions, 2 deletions
diff --git a/src/backend/access/hash/hash_xlog.c b/src/backend/access/hash/hash_xlog.c index e8e06c62a95..40debf40288 100644 --- a/src/backend/access/hash/hash_xlog.c +++ b/src/backend/access/hash/hash_xlog.c @@ -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 */ diff --git a/src/backend/access/hash/hashovfl.c b/src/backend/access/hash/hashovfl.c index 9d1ff20b922..2bd4432265c 100644 --- a/src/backend/access/hash/hashovfl.c +++ b/src/backend/access/hash/hashovfl.c @@ -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); |