summaryrefslogtreecommitdiff
path: root/src/backend/access/nbtree/nbtree.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-03-04 21:51:22 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-03-04 21:51:22 +0000
commit391eb5e5b6a78fce5179808379cdae20baedd9c3 (patch)
tree754cb44f71f1f7f00c898ef93dcfa0262148c7e7 /src/backend/access/nbtree/nbtree.c
parenta455c942574f2d6414d49893fe8ee2779c636acb (diff)
downloadpostgresql-391eb5e5b6a78fce5179808379cdae20baedd9c3.tar.gz
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().
Diffstat (limited to 'src/backend/access/nbtree/nbtree.c')
-rw-r--r--src/backend/access/nbtree/nbtree.c29
1 files changed, 9 insertions, 20 deletions
diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c
index c393e907b5..b1722244e6 100644
--- a/src/backend/access/nbtree/nbtree.c
+++ b/src/backend/access/nbtree/nbtree.c
@@ -12,7 +12,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.100 2003/02/24 00:57:17 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.101 2003/03/04 21:51:20 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -697,7 +697,7 @@ btvacuumcleanup(PG_FUNCTION_ARGS)
IndexBulkDeleteResult *stats = (IndexBulkDeleteResult *) PG_GETARG_POINTER(2);
BlockNumber num_pages;
BlockNumber blkno;
- PageFreeSpaceInfo *pageSpaces;
+ BlockNumber *freePages;
int nFreePages,
maxFreePages;
BlockNumber pages_deleted = 0;
@@ -712,7 +712,7 @@ btvacuumcleanup(PG_FUNCTION_ARGS)
maxFreePages = MaxFSMPages;
if ((BlockNumber) maxFreePages > num_pages)
maxFreePages = (int) num_pages + 1; /* +1 to avoid palloc(0) */
- pageSpaces = (PageFreeSpaceInfo *) palloc(maxFreePages * sizeof(PageFreeSpaceInfo));
+ freePages = (BlockNumber *) palloc(maxFreePages * sizeof(BlockNumber));
nFreePages = 0;
/* Create a temporary memory context to run _bt_pagedel in */
@@ -740,12 +740,7 @@ btvacuumcleanup(PG_FUNCTION_ARGS)
{
/* Okay to recycle this page */
if (nFreePages < maxFreePages)
- {
- pageSpaces[nFreePages].blkno = blkno;
- /* claimed avail-space must be < BLCKSZ */
- pageSpaces[nFreePages].avail = BLCKSZ-1;
- nFreePages++;
- }
+ freePages[nFreePages++] = blkno;
pages_deleted++;
}
else if (P_ISDELETED(opaque))
@@ -781,12 +776,7 @@ btvacuumcleanup(PG_FUNCTION_ARGS)
if (ndel && info->vacuum_full)
{
if (nFreePages < maxFreePages)
- {
- pageSpaces[nFreePages].blkno = blkno;
- /* claimed avail-space must be < BLCKSZ */
- pageSpaces[nFreePages].avail = BLCKSZ-1;
- nFreePages++;
- }
+ freePages[nFreePages++] = blkno;
}
MemoryContextSwitchTo(oldcontext);
@@ -805,8 +795,7 @@ btvacuumcleanup(PG_FUNCTION_ARGS)
{
BlockNumber new_pages = num_pages;
- while (nFreePages > 0 &&
- pageSpaces[nFreePages-1].blkno == new_pages-1)
+ while (nFreePages > 0 && freePages[nFreePages-1] == new_pages-1)
{
new_pages--;
pages_deleted--;
@@ -841,12 +830,12 @@ btvacuumcleanup(PG_FUNCTION_ARGS)
/*
* Update the shared Free Space Map with the info we now have about
- * free space in the index, discarding any old info the map may have.
+ * free pages in the index, discarding any old info the map may have.
* We do not need to sort the page numbers; they're in order already.
*/
- MultiRecordFreeSpace(&rel->rd_node, 0, nFreePages, pageSpaces);
+ RecordIndexFreeSpace(&rel->rd_node, nFreePages, freePages);
- pfree(pageSpaces);
+ pfree(freePages);
MemoryContextDelete(mycontext);