aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/freespace/freespace.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2018-03-29 12:22:37 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2018-03-29 12:22:44 -0400
commita063baaced273e955e088ba5979dcc6ec5cd92e6 (patch)
tree72361849ff10ed0d594ed14451a59c7e5b889b85 /src/backend/storage/freespace/freespace.c
parentbc0021ef09ec709fa20309228ea30ccf07f8b4e6 (diff)
downloadpostgresql-a063baaced273e955e088ba5979dcc6ec5cd92e6.tar.gz
postgresql-a063baaced273e955e088ba5979dcc6ec5cd92e6.zip
Remove UpdateFreeSpaceMap(), use FreeSpaceMapVacuumRange() instead.
FreeSpaceMapVacuumRange has the same effect, is more efficient if many pages are involved, and makes fewer assumptions about how it's used. Notably, Claudio Freire pointed out that UpdateFreeSpaceMap could fail if the specified freespace value isn't the maximum possible. This isn't a problem for the single existing user, but the function represents an attractive nuisance IMO, because it's named as though it were a general-purpose update function and its limitations are undocumented. In any case we don't need multiple ways to get the same result. In passing, do some code review and cleanup in RelationAddExtraBlocks. In particular, I see no excuse for it to omit the PageIsNew safety check that's done in the mainline extension path in RelationGetBufferForTuple. Discussion: https://postgr.es/m/CAGTBQpYR0uJCNTt3M5GOzBRHo+-GccNO1nCaQ8yEJmZKSW5q1A@mail.gmail.com
Diffstat (limited to 'src/backend/storage/freespace/freespace.c')
-rw-r--r--src/backend/storage/freespace/freespace.c81
1 files changed, 0 insertions, 81 deletions
diff --git a/src/backend/storage/freespace/freespace.c b/src/backend/storage/freespace/freespace.c
index 7eb4f3ee930..fd18c851140 100644
--- a/src/backend/storage/freespace/freespace.c
+++ b/src/backend/storage/freespace/freespace.c
@@ -111,8 +111,6 @@ static BlockNumber fsm_search(Relation rel, uint8 min_cat);
static uint8 fsm_vacuum_page(Relation rel, FSMAddress addr,
BlockNumber start, BlockNumber end,
bool *eof);
-static BlockNumber fsm_get_lastblckno(Relation rel, FSMAddress addr);
-static void fsm_update_recursive(Relation rel, FSMAddress addr, uint8 new_cat);
/******** Public API ********/
@@ -193,46 +191,6 @@ RecordPageWithFreeSpace(Relation rel, BlockNumber heapBlk, Size spaceAvail)
}
/*
- * Update the upper levels of the free space map all the way up to the root
- * to make sure we don't lose track of new blocks we just inserted. This is
- * intended to be used after adding many new blocks to the relation; we judge
- * it not worth updating the upper levels of the tree every time data for
- * a single page changes, but for a bulk-extend it's worth it.
- */
-void
-UpdateFreeSpaceMap(Relation rel, BlockNumber startBlkNum,
- BlockNumber endBlkNum, Size freespace)
-{
- int new_cat = fsm_space_avail_to_cat(freespace);
- FSMAddress addr;
- uint16 slot;
- BlockNumber blockNum;
- BlockNumber lastBlkOnPage;
-
- blockNum = startBlkNum;
-
- while (blockNum <= endBlkNum)
- {
- /*
- * Find FSM address for this block; update tree all the way to the
- * root.
- */
- addr = fsm_get_location(blockNum, &slot);
- fsm_update_recursive(rel, addr, new_cat);
-
- /*
- * Get the last block number on this FSM page. If that's greater than
- * or equal to our endBlkNum, we're done. Otherwise, advance to the
- * first block on the next page.
- */
- lastBlkOnPage = fsm_get_lastblckno(rel, addr);
- if (lastBlkOnPage >= endBlkNum)
- break;
- blockNum = lastBlkOnPage + 1;
- }
-}
-
-/*
* XLogRecordPageWithFreeSpace - like RecordPageWithFreeSpace, for use in
* WAL replay
*/
@@ -929,42 +887,3 @@ fsm_vacuum_page(Relation rel, FSMAddress addr,
return max_avail;
}
-
-/*
- * This function will return the last block number stored on given
- * FSM page address.
- */
-static BlockNumber
-fsm_get_lastblckno(Relation rel, FSMAddress addr)
-{
- int slot;
-
- /*
- * Get the last slot number on the given address and convert that to block
- * number
- */
- slot = SlotsPerFSMPage - 1;
- return fsm_get_heap_blk(addr, slot);
-}
-
-/*
- * Recursively update the FSM tree from given address to
- * all the way up to root.
- */
-static void
-fsm_update_recursive(Relation rel, FSMAddress addr, uint8 new_cat)
-{
- uint16 parentslot;
- FSMAddress parent;
-
- if (addr.level == FSM_ROOT_LEVEL)
- return;
-
- /*
- * Get the parent page and our slot in the parent page, and update the
- * information in that.
- */
- parent = fsm_get_parent(addr, &parentslot);
- fsm_set_and_search(rel, parent, parentslot, new_cat, 0);
- fsm_update_recursive(rel, parent, new_cat);
-}