From: Robert Haas Date: Thu, 4 Nov 2021 14:31:29 +0000 (-0400) Subject: fix more bugs in conveyor belt insertion X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=63a6833ff2687f53882963d32e6c98a960d48e81;p=users%2Frhaas%2Fpostgres.git fix more bugs in conveyor belt insertion - cb_metapage_remove_index_entries didn't properly clear the entries that were removed, due to bad math - ConveyorBeltGetNewPage had an unnecessary call to ConveyorBeltRead - ConveyorBeltGetNewPage also forget to release the lock and pin on a candidate payload page that turned out not to be empty all per testing with a test case provided by Dilip Kumar --- diff --git a/src/backend/access/conveyor/cbmetapage.c b/src/backend/access/conveyor/cbmetapage.c index d5f40af0e9..d20a3d273b 100644 --- a/src/backend/access/conveyor/cbmetapage.c +++ b/src/backend/access/conveyor/cbmetapage.c @@ -384,7 +384,7 @@ cb_metapage_remove_index_entries(CBMetapageData *meta, unsigned count, sizeof(CBSegNo) * (used - count)); /* Zap the entries that were formerly in use and are no longer. */ - for (offset = count; offset < used; ++offset) + for (offset = used - count; offset < used; ++offset) meta->cbm_index[offset] = CB_INVALID_SEGMENT; /* diff --git a/src/backend/access/conveyor/conveyor.c b/src/backend/access/conveyor/conveyor.c index 976a0292fd..e7b0b41ca6 100644 --- a/src/backend/access/conveyor/conveyor.c +++ b/src/backend/access/conveyor/conveyor.c @@ -490,11 +490,6 @@ ConveyorBeltGetNewPage(ConveyorBelt *cb, CBPageNo *pageno) &possibly_not_on_disk_blkno); LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE); - /* If we didn't extend the relation, just read the buffer. */ - if (!BufferIsValid(buffer)) - buffer = - ConveyorBeltRead(cb, next_blkno, BUFFER_LOCK_EXCLUSIVE); - /* * If the target buffer is still unused, we're done. Otherwise, * someone else grabbed that page before we did, so we must fall @@ -514,6 +509,9 @@ ConveyorBeltGetNewPage(ConveyorBelt *cb, CBPageNo *pageno) /* Success, so escape toplevel retry loop. */ break; } + + /* We'll have to retry with a different buffer. */ + UnlockReleaseBuffer(buffer); } /*