From 391eb5e5b6a78fce5179808379cdae20baedd9c3 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 4 Mar 2003 21:51:22 +0000 Subject: Reimplement free-space-map management as per recent discussions. Adjustable threshold is gone in favor of keeping track of total requested page storage and doling out proportional fractions to each relation (with a minimum amount per relation, and some quantization of the results to avoid thrashing with small changes in page counts). Provide special- case code for indexes so as not to waste space storing useless page free space counts. Restructure internal data storage to be a flat array instead of list-of-chunks; this may cost a little more work in data copying when reorganizing, but allows binary search to be used during lookup_fsm_page_entry(). --- src/include/storage/freespace.h | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'src/include/storage/freespace.h') diff --git a/src/include/storage/freespace.h b/src/include/storage/freespace.h index 428898bdac..05cf77d761 100644 --- a/src/include/storage/freespace.h +++ b/src/include/storage/freespace.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: freespace.h,v 1.8 2002/09/20 19:56:01 tgl Exp $ + * $Id: freespace.h,v 1.9 2003/03/04 21:51:22 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -28,6 +28,7 @@ typedef struct PageFreeSpaceInfo } PageFreeSpaceInfo; +/* GUC variables */ extern int MaxFSMRelations; extern int MaxFSMPages; @@ -39,19 +40,26 @@ extern void InitFreeSpaceMap(void); extern int FreeSpaceShmemSize(void); extern BlockNumber GetPageWithFreeSpace(RelFileNode *rel, Size spaceNeeded); -extern void RecordFreeSpace(RelFileNode *rel, BlockNumber page, - Size spaceAvail); extern BlockNumber RecordAndGetPageWithFreeSpace(RelFileNode *rel, BlockNumber oldPage, Size oldSpaceAvail, Size spaceNeeded); -extern void MultiRecordFreeSpace(RelFileNode *rel, - BlockNumber minPage, - int nPages, - PageFreeSpaceInfo *pageSpaces); +extern Size GetAvgFSMRequestSize(RelFileNode *rel); +extern void RecordRelationFreeSpace(RelFileNode *rel, + int nPages, + PageFreeSpaceInfo *pageSpaces); + +extern BlockNumber GetFreeIndexPage(RelFileNode *rel); +extern void RecordIndexFreeSpace(RelFileNode *rel, + int nPages, + BlockNumber *pages); + +extern void FreeSpaceMapTruncateRel(RelFileNode *rel, BlockNumber nblocks); extern void FreeSpaceMapForgetRel(RelFileNode *rel); extern void FreeSpaceMapForgetDatabase(Oid dbid); +extern void PrintFreeSpaceMapStatistics(int elevel); + #ifdef FREESPACE_DEBUG extern void DumpFreeSpace(void); #endif -- cgit v1.2.1