Allocate local buffers in a context of their own, rather than dumping them
authorTom Lane <[email protected]>
Thu, 19 Aug 2010 16:16:20 +0000 (16:16 +0000)
committerTom Lane <[email protected]>
Thu, 19 Aug 2010 16:16:20 +0000 (16:16 +0000)
into TopMemoryContext.  This makes no functional difference, but makes it
easier to see what the space is being used for in MemoryContextStats dumps.
Per a recent example in which I was surprised by the size of TopMemoryContext.

src/backend/storage/buffer/localbuf.c

index dd067737c9905c9140f6387fcb234ceac0cf9220..6572917f834886c72db56b017802296725798a7a 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/storage/buffer/localbuf.c,v 1.90 2010/08/13 20:10:52 rhaas Exp $
+ *       $PostgreSQL: pgsql/src/backend/storage/buffer/localbuf.c,v 1.91 2010/08/19 16:16:20 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -399,6 +399,7 @@ GetLocalBufferStorage(void)
        static int      next_buf_in_block = 0;
        static int      num_bufs_in_block = 0;
        static int      total_bufs_allocated = 0;
+       static MemoryContext LocalBufferContext = NULL;
 
        char       *this_buf;
 
@@ -409,6 +410,19 @@ GetLocalBufferStorage(void)
                /* Need to make a new request to memmgr */
                int                     num_bufs;
 
+               /*
+                * We allocate local buffers in a context of their own, so that the
+                * space eaten for them is easily recognizable in MemoryContextStats
+                * output.  Create the context on first use.
+                */
+               if (LocalBufferContext == NULL)
+                       LocalBufferContext =
+                               AllocSetContextCreate(TopMemoryContext,
+                                                                         "LocalBufferContext",
+                                                                         ALLOCSET_DEFAULT_MINSIZE,
+                                                                         ALLOCSET_DEFAULT_INITSIZE,
+                                                                         ALLOCSET_DEFAULT_MAXSIZE);
+
                /* Start with a 16-buffer request; subsequent ones double each time */
                num_bufs = Max(num_bufs_in_block * 2, 16);
                /* But not more than what we need for all remaining local bufs */
@@ -416,8 +430,7 @@ GetLocalBufferStorage(void)
                /* And don't overflow MaxAllocSize, either */
                num_bufs = Min(num_bufs, MaxAllocSize / BLCKSZ);
 
-               /* Allocate space from TopMemoryContext so it never goes away */
-               cur_block = (char *) MemoryContextAlloc(TopMemoryContext,
+               cur_block = (char *) MemoryContextAlloc(LocalBufferContext,
                                                                                                num_bufs * BLCKSZ);
                next_buf_in_block = 0;
                num_bufs_in_block = num_bufs;