diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-03-04 21:51:22 +0000 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-03-04 21:51:22 +0000 |
| commit | 391eb5e5b6a78fce5179808379cdae20baedd9c3 (patch) | |
| tree | 754cb44f71f1f7f00c898ef93dcfa0262148c7e7 /src/backend/access/nbtree/nbtree.c | |
| parent | a455c942574f2d6414d49893fe8ee2779c636acb (diff) | |
| download | postgresql-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.c | 29 |
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); |
