Fix IndexBuildUHeapScan release buffer too early

Offering: openGaussDev

More detail: Fix IndexBuildUHeapScan release buffer too early

Match-id-a1c03d8bfb863446b058ec2220eccd49887dc97e
This commit is contained in:
openGaussDev 2022-03-10 11:16:01 +08:00 committed by yanghao
parent 76d76c8b12
commit b2c77be2dd
1 changed files with 7 additions and 1 deletions

View File

@ -1193,6 +1193,10 @@ Buffer UHeapIndexBuildNextBlock(UHeapScanDesc scan)
} }
scan->rs_base.rs_ntuples = 0; scan->rs_base.rs_ntuples = 0;
scan->rs_cutup = NULL; 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) { if (blkno >= scan->rs_base.rs_nblocks) {
return InvalidBuffer; /* we are done */ return InvalidBuffer; /* we are done */
@ -1202,6 +1206,7 @@ Buffer UHeapIndexBuildNextBlock(UHeapScanDesc scan)
/* read the next page, and lock with exclusive mode */ /* 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); Buffer buf = ReadBufferExtended(scan->rs_base.rs_rd, MAIN_FORKNUM, blkno, RBM_NORMAL, scan->rs_base.rs_strategy);
LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE); LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE);
scan->rs_base.rs_cbuf = buf;
return buf; return buf;
} }
@ -1274,7 +1279,8 @@ bool UHeapIndexBuildNextPage(UHeapScanDesc scan)
scan->rs_base.rs_ntuples = ntup; scan->rs_base.rs_ntuples = ntup;
scan->rs_base.rs_cindex = 0; scan->rs_base.rs_cindex = 0;
UnlockReleaseBuffer(buf); /* drop the lock but keep the pin */
LockBuffer(buf, BUFFER_LOCK_UNLOCK);
return true; return true;
} }