Allocate local buffers in a context of their own, rather than dumping them
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 19 Aug 2010 16:16:20 +0000 (16:16 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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;