From fe429522d05d5a0cf37026b27f217b500986634e Mon Sep 17 00:00:00 2001 From: chendong76 <1209756284@qq.com> Date: Wed, 1 Jun 2022 20:20:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dhash=5Findex=E5=9B=9E?= =?UTF-8?q?=E6=94=BE=E6=97=B6=E6=9C=AA=E5=88=A4=E6=96=AD=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=80=BC=E5=BC=95=E5=8F=91=E7=9A=84core=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/storage/access/hash/hash.cpp | 16 ++++++++-------- .../storage/access/hash/hash_xlog.cpp | 12 +++++------- .../storage/access/redo/redo_hash.cpp | 5 ++++- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/gausskernel/storage/access/hash/hash.cpp b/src/gausskernel/storage/access/hash/hash.cpp index f6dfff88d..c124c9499 100644 --- a/src/gausskernel/storage/access/hash/hash.cpp +++ b/src/gausskernel/storage/access/hash/hash.cpp @@ -827,6 +827,9 @@ void hashbucketcleanup(Relation rel, Bucket cur_bucket, Buffer bucket_buf, clear_dead_marking = true; } + if (buf != bucket_buf) { + MarkBufferDirty(bucket_buf); + } MarkBufferDirty(buf); /* XLOG stuff */ @@ -871,24 +874,21 @@ void hashbucketcleanup(Relation rel, Bucket cur_bucket, Buffer bucket_buf, /* * release the lock on previous page after acquiring the lock on next - * page + * page, except the primary bucket page */ - if (retain_pin) - LockBuffer(buf, BUFFER_LOCK_UNLOCK); - else + if (!retain_pin) _hash_relbuf(rel, buf); buf = next_buf; } /* - * lock the bucket page to clear the garbage flag and squeeze the bucket. - * if the current buffer is same as bucket buffer, then we already have - * lock on bucket page. + * Lock the bucket page to clear the garbage flag and squeeze the bucket. + * We already have lock on bucket page in the previous step, so release + * the overflow pages is enough. */ if (buf != bucket_buf) { _hash_relbuf(rel, buf); - LockBuffer(bucket_buf, BUFFER_LOCK_EXCLUSIVE); } /* diff --git a/src/gausskernel/storage/access/hash/hash_xlog.cpp b/src/gausskernel/storage/access/hash/hash_xlog.cpp index 9bf435b2b..5ac257a5b 100644 --- a/src/gausskernel/storage/access/hash/hash_xlog.cpp +++ b/src/gausskernel/storage/access/hash/hash_xlog.cpp @@ -545,13 +545,11 @@ static void hash_xlog_delete(XLogReaderState *record) if (xldata->is_primary_bucket_page) { action = XLogReadBufferForRedoExtended(record, 1, RBM_NORMAL, true, &deletebuf); } else { - /* - * we don't care for return value as the purpose of reading bucketbuf - * is to ensure a cleanup lock on primary bucket page. - */ - (void) XLogReadBufferForRedoExtended(record, 0, RBM_NORMAL, true, &bucketbuf); - - PageSetLSN(bucketbuf.pageinfo.page, lsn); + /* read bucketbuf for a cleanup lock on primary bucket page */ + if (XLogReadBufferForRedoExtended(record, 0, RBM_NORMAL, true, &bucketbuf) == BLK_NEEDS_REDO) { + PageSetLSN(bucketbuf.pageinfo.page, lsn); + MarkBufferDirty(bucketbuf.buf); + } action = XLogReadBufferForRedo(record, 1, &deletebuf); } diff --git a/src/gausskernel/storage/access/redo/redo_hash.cpp b/src/gausskernel/storage/access/redo/redo_hash.cpp index 4b71331e2..124f4877b 100644 --- a/src/gausskernel/storage/access/redo/redo_hash.cpp +++ b/src/gausskernel/storage/access/redo/redo_hash.cpp @@ -1244,7 +1244,10 @@ static void HashXlogDeleteBlock(XLogBlockHead *blockhead, XLogBlockDataParse *bl MakeRedoBufferDirty(bufferinfo); } } else { - PageSetLSN(bufferinfo->pageinfo.page, bufferinfo->lsn); + if (action == BLK_NEEDS_REDO) { + PageSetLSN(bufferinfo->pageinfo.page, bufferinfo->lsn); + MakeRedoBufferDirty(bufferinfo); + } } }