Fix contrib/pg_freespacemap's underestimate of the number of pages it
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 7 Apr 2009 18:11:04 +0000 (18:11 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 7 Apr 2009 18:11:04 +0000 (18:11 +0000)
could find in the FSM.  Per report from Dimitri Fontaine and Andrew Gierth.

(Affects only 8.2 and 8.3 since HEAD no longer has MaxFSMPages at all.)

contrib/pg_freespacemap/pg_freespacemap.c

index cfe5cb0268c7909763008cd51f20c98cd5352e3b..e4475c1ffc1b60d9ee8eee3856483e714abe3256 100644 (file)
@@ -3,7 +3,7 @@
  * pg_freespacemap.c
  *   display some contents of the free space relation and page maps.
  *
- *   $PostgreSQL: pgsql/contrib/pg_freespacemap/pg_freespacemap.c,v 1.9 2006/10/19 18:32:46 tgl Exp $
+ *   $PostgreSQL: pgsql/contrib/pg_freespacemap/pg_freespacemap.c,v 1.9.2.1 2009/04/07 18:11:04 tgl Exp $
  *-------------------------------------------------------------------------
  */
 #include "postgres.h"
@@ -94,6 +94,7 @@ pg_freespacemap_pages(PG_FUNCTION_ARGS)
    if (SRF_IS_FIRSTCALL())
    {
        int         i;
+       int         nchunks;    /* Size of freespace.c's arena. */
        int         numPages;   /* Max possible no. of pages in map. */
        int         nPages;     /* Mapped pages for a relation. */
 
@@ -102,7 +103,10 @@ pg_freespacemap_pages(PG_FUNCTION_ARGS)
         */
        FreeSpaceMap = GetFreeSpaceMap();
 
-       numPages = MaxFSMPages;
+       /* this must match calculation in InitFreeSpaceMap(): */
+       nchunks = (MaxFSMPages - 1) / CHUNKPAGES + 1;
+       /* Worst case (lots of indexes) could have this many pages: */
+       numPages = nchunks * INDEXCHUNKPAGES;
 
        funcctx = SRF_FIRSTCALL_INIT();