diff options
Diffstat (limited to 'src/backend/access/heap/hio.c')
-rw-r--r-- | src/backend/access/heap/hio.c | 42 |
1 files changed, 17 insertions, 25 deletions
diff --git a/src/backend/access/heap/hio.c b/src/backend/access/heap/hio.c index 69a7a23874f..d41d318eef9 100644 --- a/src/backend/access/heap/hio.c +++ b/src/backend/access/heap/hio.c @@ -246,14 +246,8 @@ RelationAddExtraBlocks(Relation relation, BulkInsertState bistate) * Immediately update the bottom level of the FSM. This has a good * chance of making this page visible to other concurrently inserting * backends, and we want that to happen without delay. - * - * Since we know the table will end up with extraBlocks additional - * pages, we pass the final number to avoid possible unnecessary - * system calls and to make sure the FSM is created when we add the - * first new page. */ - RecordPageWithFreeSpace(relation, blockNum, freespace, - firstBlock + extraBlocks); + RecordPageWithFreeSpace(relation, blockNum, freespace); } while (--extraBlocks > 0); @@ -390,9 +384,20 @@ RelationGetBufferForTuple(Relation relation, Size len, * We have no cached target page, so ask the FSM for an initial * target. */ - targetBlock = GetPageWithFreeSpace(relation, - len + saveFreeSpace, - false); + targetBlock = GetPageWithFreeSpace(relation, len + saveFreeSpace); + + /* + * If the FSM knows nothing of the rel, try the last page before we + * give up and extend. This avoids one-tuple-per-page syndrome during + * bootstrapping or in a recently-started system. + */ + if (targetBlock == InvalidBlockNumber) + { + BlockNumber nblocks = RelationGetNumberOfBlocks(relation); + + if (nblocks > 0) + targetBlock = nblocks - 1; + } } loop: @@ -499,13 +504,6 @@ loop: { /* use this page as future insert target, too */ RelationSetTargetBlock(relation, targetBlock); - - /* - * In case we used an in-memory map of available blocks, reset it - * for next use. - */ - FSMClearLocalMap(); - return buffer; } @@ -565,12 +563,9 @@ loop: /* * Check if some other backend has extended a block for us while - * we were waiting on the lock. We only check the FSM -- if there - * isn't one we don't recheck the number of blocks. + * we were waiting on the lock. */ - targetBlock = GetPageWithFreeSpace(relation, - len + saveFreeSpace, - true); + targetBlock = GetPageWithFreeSpace(relation, len + saveFreeSpace); /* * If some other waiter has already extended the relation, we @@ -675,8 +670,5 @@ loop: */ RelationSetTargetBlock(relation, BufferGetBlockNumber(buffer)); - /* This should already be cleared by now, but make sure it is. */ - FSMClearLocalMap(); - return buffer; } |