From bc7cb8f42cc607f1fcd2aca0a7b007fc8e9930d0 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 19 Aug 2010 16:16:20 +0000 Subject: [PATCH] Allocate local buffers in a context of their own, rather than dumping them 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 | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/backend/storage/buffer/localbuf.c b/src/backend/storage/buffer/localbuf.c index dd067737c9..6572917f83 100644 --- a/src/backend/storage/buffer/localbuf.c +++ b/src/backend/storage/buffer/localbuf.c @@ -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;