aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/gist
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2006-09-21 20:31:22 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2006-09-21 20:31:22 +0000
commit9e936693a9fc464511b52b14fb681cdea014bf59 (patch)
tree2781b3043a8b46dcf3d40d6410d2b7b970fa0b5e /src/backend/access/gist
parentb0d64a090b14217c9bcf620a32c60eab1354470f (diff)
downloadpostgresql-9e936693a9fc464511b52b14fb681cdea014bf59.tar.gz
postgresql-9e936693a9fc464511b52b14fb681cdea014bf59.zip
Fix free space map to correctly track the total amount of FSM space needed
even when a single relation requires more than max_fsm_pages pages. Also, make VACUUM emit a warning in this case, since it likely means that VACUUM FULL or other drastic corrective measure is needed. Per reports from Jeff Frost and others of unexpected changes in the claimed max_fsm_pages need.
Diffstat (limited to 'src/backend/access/gist')
-rw-r--r--src/backend/access/gist/gistvacuum.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c
index 37b5631b281..e5c73c8c224 100644
--- a/src/backend/access/gist/gistvacuum.c
+++ b/src/backend/access/gist/gistvacuum.c
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.26 2006/07/31 20:08:59 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.27 2006/09/21 20:31:21 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -491,7 +491,8 @@ gistvacuumcleanup(PG_FUNCTION_ARGS)
Relation rel = info->index;
BlockNumber npages,
blkno;
- BlockNumber nFreePages,
+ BlockNumber totFreePages,
+ nFreePages,
*freePages,
maxFreePages;
BlockNumber lastBlock = GIST_ROOT_BLKNO,
@@ -563,8 +564,9 @@ gistvacuumcleanup(PG_FUNCTION_ARGS)
if (maxFreePages > MaxFSMPages)
maxFreePages = MaxFSMPages;
- nFreePages = 0;
+ totFreePages = nFreePages = 0;
freePages = (BlockNumber *) palloc(sizeof(BlockNumber) * maxFreePages);
+
for (blkno = GIST_ROOT_BLKNO + 1; blkno < npages; blkno++)
{
Buffer buffer;
@@ -579,10 +581,8 @@ gistvacuumcleanup(PG_FUNCTION_ARGS)
if (PageIsNew(page) || GistPageIsDeleted(page))
{
if (nFreePages < maxFreePages)
- {
- freePages[nFreePages] = blkno;
- nFreePages++;
- }
+ freePages[nFreePages++] = blkno;
+ totFreePages++;
}
else
lastFilledBlock = blkno;
@@ -597,7 +597,7 @@ gistvacuumcleanup(PG_FUNCTION_ARGS)
for (i = 0; i < nFreePages; i++)
if (freePages[i] >= lastFilledBlock)
{
- nFreePages = i;
+ totFreePages = nFreePages = i;
break;
}
@@ -606,11 +606,11 @@ gistvacuumcleanup(PG_FUNCTION_ARGS)
stats->std.pages_removed = lastBlock - lastFilledBlock;
}
- RecordIndexFreeSpace(&rel->rd_node, nFreePages, freePages);
+ RecordIndexFreeSpace(&rel->rd_node, totFreePages, nFreePages, freePages);
pfree(freePages);
/* return statistics */
- stats->std.pages_free = nFreePages;
+ stats->std.pages_free = totFreePages;
if (needLock)
LockRelationForExtension(rel, ExclusiveLock);
stats->std.num_pages = RelationGetNumberOfBlocks(rel);