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 | |
parent | a455c942574f2d6414d49893fe8ee2779c636acb (diff) | |
download | postgresql-391eb5e5b6a78fce5179808379cdae20baedd9c3.tar.gz postgresql-391eb5e5b6a78fce5179808379cdae20baedd9c3.zip |
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')
-rw-r--r-- | src/backend/access/nbtree/nbtpage.c | 9 | ||||
-rw-r--r-- | src/backend/access/nbtree/nbtree.c | 29 |
2 files changed, 11 insertions, 27 deletions
diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c index c8fb7628ead..f9d108e769b 100644 --- a/src/backend/access/nbtree/nbtpage.c +++ b/src/backend/access/nbtree/nbtpage.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtpage.c,v 1.63 2003/02/23 23:20:52 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtpage.c,v 1.64 2003/03/04 21:51:20 tgl Exp $ * * NOTES * Postgres btree pages look like ordinary relation pages. The opaque @@ -401,15 +401,10 @@ _bt_getbuf(Relation rel, BlockNumber blkno, int access) * that the page is still free. (For example, an already-free page * could have been re-used between the time the last VACUUM scanned * it and the time the VACUUM made its FSM updates.) - * - * The request size should be more than half of what btvacuumcleanup - * logs as the per-page free space. We use BLCKSZ/2 and BLCKSZ-1 - * to try to get some use out of FSM's space management algorithm. - * XXX this needs some more thought... */ for (;;) { - blkno = GetPageWithFreeSpace(&rel->rd_node, BLCKSZ/2); + blkno = GetFreeIndexPage(&rel->rd_node); if (blkno == InvalidBlockNumber) break; buf = ReadBuffer(rel, blkno); diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c index c393e907b59..b1722244e6d 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); |