]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Include last block in FSM vacuum of bulk extended relation REL_16_STABLE github/REL_16_STABLE
authorMelanie Plageman <melanieplageman@gmail.com>
Wed, 15 Jul 2026 19:49:59 +0000 (15:49 -0400)
committerMelanie Plageman <melanieplageman@gmail.com>
Wed, 15 Jul 2026 19:58:15 +0000 (15:58 -0400)
When bulk-extending a relation, we add the newly-added blocks that we
won't immediately use to the free space map and then call
FreeSpaceMapVacuumRange() to propagate that free space up the FSM tree,
so other backends can find and reuse it.

However, the end block argument to FreeSpaceMapVacuumRange() is
exclusive, and we passed the number of the last added block (since
00d1e02be24). If that block was the first one covered by a new FSM page,
its free space wasn't propagated up the tree and was therefore invisible
to FSM searches until the next FSM vacuum.

Fix by passing the block number one past the last added block, so the
full range is vacuumed.

Author: Jingtang Zhang <mrdrivingduck@gmail.com>
Reviewed-by: Melanie Plageman <melanieplageman@gmail.com>
Discussion: https://postgr.es/m/flat/CAPsk3_Bx_vdybN%3D-DZu8HLStf%2BXnuFUBkLwxouONSMkWuO9oug%40mail.gmail.com
Backpatch-through: 16

src/backend/access/heap/hio.c

index ccc4c6966a2062f1c25d3db34bb2806139a27b73..390db47d44e18a1ed67b8eb77611eb38fe17ab40 100644 (file)
@@ -404,7 +404,7 @@ RelationAddBlocks(Relation relation, BulkInsertState bistate,
        {
                BlockNumber first_fsm_block = first_block + not_in_fsm_pages;
 
-               FreeSpaceMapVacuumRange(relation, first_fsm_block, last_block);
+               FreeSpaceMapVacuumRange(relation, first_fsm_block, last_block + 1);
        }
 
        if (bistate)