diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-03-19 23:27:11 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-03-19 23:27:11 +0000 |
commit | 91728fa26cabac4b34055ab8e23d0751f0b16753 (patch) | |
tree | 59a1caabd632d250173dbe6fcec4031ce05283b4 /src/backend | |
parent | d65522aeb6eac89f8491b0852c3543d6c0aeb94a (diff) | |
download | postgresql-91728fa26cabac4b34055ab8e23d0751f0b16753.tar.gz postgresql-91728fa26cabac4b34055ab8e23d0751f0b16753.zip |
Add temp_buffers GUC variable to allow users to determine the size
of the local buffer arena for temporary table access.
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/storage/buffer/localbuf.c | 46 | ||||
-rw-r--r-- | src/backend/utils/init/postinit.c | 3 | ||||
-rw-r--r-- | src/backend/utils/misc/guc.c | 28 | ||||
-rw-r--r-- | src/backend/utils/misc/postgresql.conf.sample | 1 |
4 files changed, 55 insertions, 23 deletions
diff --git a/src/backend/storage/buffer/localbuf.c b/src/backend/storage/buffer/localbuf.c index c2a1ed587e1..0e9e7b68cc3 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.65 2005/03/19 17:39:43 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/storage/buffer/localbuf.c,v 1.66 2005/03/19 23:27:05 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -18,6 +18,7 @@ #include "storage/buf_internals.h" #include "storage/bufmgr.h" #include "storage/smgr.h" +#include "utils/guc.h" #include "utils/memutils.h" #include "utils/resowner.h" @@ -46,6 +47,9 @@ static int nextFreeLocalBuf = 0; static HTAB *LocalBufHash = NULL; +static void InitLocalBuffers(void); + + /* * LocalBufferAlloc - * Find or create a local buffer for the given page of the given relation. @@ -66,6 +70,10 @@ LocalBufferAlloc(Relation reln, BlockNumber blockNum, bool *foundPtr) INIT_BUFFERTAG(newTag, reln, blockNum); + /* Initialize local buffers if first request in this session */ + if (LocalBufHash == NULL) + InitLocalBuffers(); + /* See if the desired buffer already exists */ hresult = (LocalBufferLookupEnt *) hash_search(LocalBufHash, (void *) &newTag, HASH_FIND, NULL); @@ -238,32 +246,18 @@ WriteLocalBuffer(Buffer buffer, bool release) } /* - * InitLocalBuffer - + * InitLocalBuffers - * init the local buffer cache. Since most queries (esp. multi-user ones) * don't involve local buffers, we delay allocating actual memory for the * buffers until we need them; just make the buffer headers here. */ -void -InitLocalBuffer(void) +static void +InitLocalBuffers(void) { - int nbufs = 64; /* should be from a GUC var */ + int nbufs = num_temp_buffers; HASHCTL info; int i; - /* Create the lookup hash table */ - MemSet(&info, 0, sizeof(info)); - info.keysize = sizeof(BufferTag); - info.entrysize = sizeof(LocalBufferLookupEnt); - info.hash = tag_hash; - - LocalBufHash = hash_create("Local Buffer Lookup Table", - nbufs, - &info, - HASH_ELEM | HASH_FUNCTION); - - if (!LocalBufHash) - elog(ERROR, "could not initialize local buffer hash table"); - /* Allocate and zero buffer headers and auxiliary arrays */ LocalBufferDescriptors = (BufferDesc *) MemoryContextAllocZero(TopMemoryContext, @@ -291,6 +285,20 @@ InitLocalBuffer(void) buf->buf_id = -i - 2; } + /* Create the lookup hash table */ + MemSet(&info, 0, sizeof(info)); + info.keysize = sizeof(BufferTag); + info.entrysize = sizeof(LocalBufferLookupEnt); + info.hash = tag_hash; + + LocalBufHash = hash_create("Local Buffer Lookup Table", + nbufs, + &info, + HASH_ELEM | HASH_FUNCTION); + + if (!LocalBufHash) + elog(ERROR, "could not initialize local buffer hash table"); + /* Initialization done, mark buffers allocated */ NLocBuffer = nbufs; } diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 05f669c2ccd..00b541204b4 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.143 2005/03/18 16:16:09 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.144 2005/03/19 23:27:06 tgl Exp $ * * *------------------------------------------------------------------------- @@ -257,7 +257,6 @@ BaseInit(void) /* Do local initialization of storage and buffer managers */ smgrinit(); InitBufferPoolAccess(); - InitLocalBuffer(); } diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 67374a4b61f..11e6d3de58d 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10,7 +10,7 @@ * Written by Peter Eisentraut <peter_e@gmx.net>. * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.255 2005/03/13 09:36:31 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.256 2005/03/19 23:27:07 tgl Exp $ * *-------------------------------------------------------------------- */ @@ -104,6 +104,7 @@ static const char *assign_log_error_verbosity(const char *newval, bool doit, GucSource source); static const char *assign_log_statement(const char *newval, bool doit, GucSource source); +static const char *show_num_temp_buffers(void); static bool assign_phony_autocommit(bool newval, bool doit, GucSource source); static const char *assign_custom_variable_classes(const char *newval, bool doit, GucSource source); @@ -144,9 +145,10 @@ bool default_with_oids = false; int log_min_error_statement = PANIC; int log_min_messages = NOTICE; int client_min_messages = NOTICE; - int log_min_duration_statement = -1; +int num_temp_buffers = 1000; + char *ConfigFileName; char *HbaFileName; char *IdentFileName; @@ -967,6 +969,15 @@ static struct config_int ConfigureNamesInt[] = }, { + {"temp_buffers", PGC_USERSET, RESOURCES_MEM, + gettext_noop("Sets the maximum number of temporary buffers used by each session."), + NULL + }, + &num_temp_buffers, + 1000, 100, INT_MAX / BLCKSZ, NULL, show_num_temp_buffers + }, + + { {"port", PGC_POSTMASTER, CONN_AUTH_SETTINGS, gettext_noop("Sets the TCP port the server listens on."), NULL @@ -5496,6 +5507,19 @@ assign_log_statement(const char *newval, bool doit, GucSource source) return newval; /* OK */ } +static const char * +show_num_temp_buffers(void) +{ + /* + * We show the GUC var until local buffers have been initialized, + * and NLocBuffer afterwards. + */ + static char nbuf[32]; + + sprintf(nbuf, "%d", NLocBuffer ? NLocBuffer : num_temp_buffers); + return nbuf; +} + static bool assign_phony_autocommit(bool newval, bool doit, GucSource source) { diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 070d1e7632e..b68cd2f8cf9 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -74,6 +74,7 @@ # - Memory - #shared_buffers = 1000 # min 16, at least max_connections*2, 8KB each +#temp_buffers = 1000 # min 100, 8KB each #work_mem = 1024 # min 64, size in KB #maintenance_work_mem = 16384 # min 1024, size in KB #max_stack_depth = 2048 # min 100, size in KB |