diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2004-04-19 23:27:17 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2004-04-19 23:27:17 +0000 |
commit | 011c3e62e78b02a573f6f59ce78b1e7515d380c0 (patch) | |
tree | 19c3c8ab77264aa49421cd432025f0fa25edbf60 /src/backend/storage/buffer/buf_init.c | |
parent | 8f73bbae854b71bea6a544941886f072829beb72 (diff) | |
download | postgresql-011c3e62e78b02a573f6f59ce78b1e7515d380c0.tar.gz postgresql-011c3e62e78b02a573f6f59ce78b1e7515d380c0.zip |
Code review for ARC patch. Eliminate static variables, improve handling
of VACUUM cases so that VACUUM requests don't affect the ARC state at all,
avoid corner case where BufferSync would uselessly rewrite a buffer that
no longer contains the page that was to be flushed. Make some minor
other cleanups in and around the bufmgr as well, such as moving PinBuffer
and UnpinBuffer into bufmgr.c where they really belong.
Diffstat (limited to 'src/backend/storage/buffer/buf_init.c')
-rw-r--r-- | src/backend/storage/buffer/buf_init.c | 91 |
1 files changed, 30 insertions, 61 deletions
diff --git a/src/backend/storage/buffer/buf_init.c b/src/backend/storage/buffer/buf_init.c index a671bf9f7ff..e0aa0e93e86 100644 --- a/src/backend/storage/buffer/buf_init.c +++ b/src/backend/storage/buffer/buf_init.c @@ -8,35 +8,15 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/storage/buffer/buf_init.c,v 1.62 2004/02/12 15:06:56 wieck Exp $ + * $PostgreSQL: pgsql/src/backend/storage/buffer/buf_init.c,v 1.63 2004/04/19 23:27:17 tgl Exp $ * *------------------------------------------------------------------------- */ #include "postgres.h" -#include <sys/file.h> -#include <math.h> -#include <signal.h> - -#include "catalog/catalog.h" -#include "executor/execdebug.h" -#include "miscadmin.h" -#include "storage/buf.h" -#include "storage/buf_internals.h" #include "storage/bufmgr.h" -#include "storage/fd.h" -#include "storage/ipc.h" -#include "storage/lmgr.h" -#include "storage/shmem.h" -#include "storage/smgr.h" -#include "storage/lwlock.h" -#include "utils/builtins.h" -#include "utils/hsearch.h" -#include "utils/memutils.h" - -int ShowPinTrace = 0; +#include "storage/buf_internals.h" -int Data_Descriptors; BufferDesc *BufferDescriptors; Block *BufferBlockPointers; @@ -44,6 +24,14 @@ Block *BufferBlockPointers; long *PrivateRefCount; /* also used in freelist.c */ bits8 *BufferLocks; /* flag bits showing locks I have set */ +/* statistics counters */ +long int ReadBufferCount; +long int ReadLocalBufferCount; +long int BufferHitCount; +long int LocalBufferHitCount; +long int BufferFlushCount; +long int LocalBufferFlushCount; + /* * Data Structures: @@ -61,48 +49,35 @@ bits8 *BufferLocks; /* flag bits showing locks I have set */ * see freelist.c. A buffer cannot be replaced while in * use either by data manager or during IO. * - * WriteBufferBack: - * currently, a buffer is only written back at the time - * it is selected for replacement. It should - * be done sooner if possible to reduce latency of - * BufferAlloc(). Maybe there should be a daemon process. * * Synchronization/Locking: * * BufMgrLock lock -- must be acquired before manipulating the - * buffer queues (lookup/freelist). Must be released + * buffer search datastructures (lookup/freelist, as well as the + * flag bits of any buffer). Must be released * before exit and before doing any IO. * * IO_IN_PROGRESS -- this is a flag in the buffer descriptor. * It must be set when an IO is initiated and cleared at - * the end of the IO. It is there to make sure that one + * the end of the IO. It is there to make sure that one * process doesn't start to use a buffer while another is * faulting it in. see IOWait/IOSignal. * - * refcount -- A buffer is pinned during IO and immediately - * after a BufferAlloc(). A buffer is always either pinned - * or on the freelist but never both. The buffer must be - * released, written, or flushed before the end of - * transaction. + * refcount -- Counts the number of processes holding pins on a buffer. + * A buffer is pinned during IO and immediately after a BufferAlloc(). + * Pins must be released before end of transaction. * - * PrivateRefCount -- Each buffer also has a private refcount the keeps + * PrivateRefCount -- Each buffer also has a private refcount that keeps * track of the number of times the buffer is pinned in the current - * processes. This is used for two purposes, first, if we pin a + * process. This is used for two purposes: first, if we pin a * a buffer more than once, we only need to change the shared refcount - * once, thus only lock the buffer pool once, second, when a transaction + * once, thus only lock the shared state once; second, when a transaction * aborts, it should only unpin the buffers exactly the number of times it * has pinned them, so that it will not blow away buffers of another * backend. * */ -long int ReadBufferCount; -long int ReadLocalBufferCount; -long int BufferHitCount; -long int LocalBufferHitCount; -long int BufferFlushCount; -long int LocalBufferFlushCount; - /* * Initialize shared buffer pool @@ -118,8 +93,6 @@ InitBufferPool(void) foundDescs; int i; - Data_Descriptors = NBuffers; - /* * It's probably not really necessary to grab the lock --- if there's * anyone else attached to the shmem at this point, we've got @@ -131,7 +104,7 @@ InitBufferPool(void) BufferDescriptors = (BufferDesc *) ShmemInitStruct("Buffer Descriptors", - Data_Descriptors * sizeof(BufferDesc), &foundDescs); + NBuffers * sizeof(BufferDesc), &foundDescs); BufferBlocks = (char *) ShmemInitStruct("Buffer Blocks", @@ -152,9 +125,9 @@ InitBufferPool(void) /* * link the buffers into a single linked list. This will become the - * LiFo list of unused buffers returned by StragegyGetBuffer(). + * LIFO list of unused buffers returned by StrategyGetBuffer(). */ - for (i = 0; i < Data_Descriptors; block += BLCKSZ, buf++, i++) + for (i = 0; i < NBuffers; block += BLCKSZ, buf++, i++) { Assert(ShmemIsValid((unsigned long) block)); @@ -173,7 +146,7 @@ InitBufferPool(void) } /* Correct last entry */ - BufferDescriptors[Data_Descriptors - 1].bufNext = -1; + BufferDescriptors[NBuffers - 1].bufNext = -1; } /* Init other shared buffer-management stuff */ @@ -215,35 +188,31 @@ InitBufferPoolAccess(void) BufferBlockPointers[i] = (Block) MAKE_PTR(BufferDescriptors[i].data); } -/* ----------------------------------------------------- +/* * BufferShmemSize * * compute the size of shared memory for the buffer pool including * data pages, buffer descriptors, hash tables, etc. - * ---------------------------------------------------- */ int BufferShmemSize(void) { int size = 0; - /* size of shmem index hash table */ - size += hash_estimate_size(SHMEM_INDEX_SIZE, sizeof(ShmemIndexEnt)); - /* size of buffer descriptors */ size += MAXALIGN(NBuffers * sizeof(BufferDesc)); - /* size of the shared replacement strategy control block */ - size += MAXALIGN(sizeof(BufferStrategyControl)); - - /* size of the ARC directory blocks */ - size += MAXALIGN(NBuffers * 2 * sizeof(BufferStrategyCDB)); - /* size of data pages */ size += NBuffers * MAXALIGN(BLCKSZ); /* size of buffer hash table */ size += hash_estimate_size(NBuffers * 2, sizeof(BufferLookupEnt)); + /* size of the shared replacement strategy control block */ + size += MAXALIGN(sizeof(BufferStrategyControl)); + + /* size of the ARC directory blocks */ + size += MAXALIGN(NBuffers * 2 * sizeof(BufferStrategyCDB)); + return size; } |