From b2c77be2ddedacb563e75eade3967487d7b2ebc6 Mon Sep 17 00:00:00 2001 From: openGaussDev Date: Thu, 10 Mar 2022 11:16:01 +0800 Subject: [PATCH] Fix IndexBuildUHeapScan release buffer too early Offering: openGaussDev More detail: Fix IndexBuildUHeapScan release buffer too early Match-id-a1c03d8bfb863446b058ec2220eccd49887dc97e --- src/gausskernel/storage/access/ustore/knl_uscan.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/gausskernel/storage/access/ustore/knl_uscan.cpp b/src/gausskernel/storage/access/ustore/knl_uscan.cpp index 62f0b4eba..923ef5bcd 100644 --- a/src/gausskernel/storage/access/ustore/knl_uscan.cpp +++ b/src/gausskernel/storage/access/ustore/knl_uscan.cpp @@ -1193,6 +1193,10 @@ Buffer UHeapIndexBuildNextBlock(UHeapScanDesc scan) } scan->rs_base.rs_ntuples = 0; scan->rs_cutup = NULL; + if (BufferIsValid(scan->rs_base.rs_cbuf)) { + ReleaseBuffer(scan->rs_base.rs_cbuf); + scan->rs_base.rs_cbuf = InvalidBuffer; + } if (blkno >= scan->rs_base.rs_nblocks) { return InvalidBuffer; /* we are done */ @@ -1202,6 +1206,7 @@ Buffer UHeapIndexBuildNextBlock(UHeapScanDesc scan) /* read the next page, and lock with exclusive mode */ Buffer buf = ReadBufferExtended(scan->rs_base.rs_rd, MAIN_FORKNUM, blkno, RBM_NORMAL, scan->rs_base.rs_strategy); LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE); + scan->rs_base.rs_cbuf = buf; return buf; } @@ -1274,7 +1279,8 @@ bool UHeapIndexBuildNextPage(UHeapScanDesc scan) scan->rs_base.rs_ntuples = ntup; scan->rs_base.rs_cindex = 0; - UnlockReleaseBuffer(buf); + /* drop the lock but keep the pin */ + LockBuffer(buf, BUFFER_LOCK_UNLOCK); return true; }