mirror of
https://github.com/postgres/postgres.git
synced 2025-08-27 07:42:10 +03:00
Revert "Avoid creation of the free space map for small heap relations."
This reverts commit ac88d2962a
.
This commit is contained in:
@@ -239,14 +239,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);
|
||||
|
||||
@@ -383,9 +377,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:
|
||||
@@ -479,14 +484,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.
|
||||
*/
|
||||
if (targetBlock < HEAP_FSM_CREATION_THRESHOLD)
|
||||
FSMClearLocalMap();
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
@@ -546,12 +543,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
|
||||
@@ -631,12 +625,5 @@ loop:
|
||||
*/
|
||||
RelationSetTargetBlock(relation, BufferGetBlockNumber(buffer));
|
||||
|
||||
/*
|
||||
* In case we used an in-memory map of available blocks, reset it for next
|
||||
* use. We do this unconditionally since after relation extension we
|
||||
* can't skip this based on the targetBlock.
|
||||
*/
|
||||
FSMClearLocalMap();
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
Reference in New Issue
Block a user