aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access
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
parenta455c942574f2d6414d49893fe8ee2779c636acb (diff)
downloadpostgresql-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.c9
-rw-r--r--src/backend/access/nbtree/nbtree.c29
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);