buffers that cannot possibly need to be cleaned, and estimates how many buffers it should try to clean based on moving averages of recent allocation requests and density of reusable buffers. The patch also adds a couple more columns to pg_stat_bgwriter to help measure the effectiveness of the bgwriter. Greg Smith, building on his own work and ideas from several other people, in particular a much older patch from Itagaki Takahiro.
173 lines
5.1 KiB
C
173 lines
5.1 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* bufmgr.h
|
|
* POSTGRES buffer manager definitions.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.108 2007/09/25 20:03:38 tgl Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef BUFMGR_H
|
|
#define BUFMGR_H
|
|
|
|
#include "storage/buf.h"
|
|
#include "utils/rel.h"
|
|
|
|
typedef void *Block;
|
|
|
|
/* Possible arguments for GetAccessStrategy() */
|
|
typedef enum BufferAccessStrategyType
|
|
{
|
|
BAS_NORMAL, /* Normal random access */
|
|
BAS_BULKREAD, /* Large read-only scan (hint bit updates are ok) */
|
|
BAS_VACUUM /* VACUUM */
|
|
} BufferAccessStrategyType;
|
|
|
|
/* in globals.c ... this duplicates miscadmin.h */
|
|
extern PGDLLIMPORT int NBuffers;
|
|
|
|
/* in bufmgr.c */
|
|
extern bool zero_damaged_pages;
|
|
extern int bgwriter_lru_maxpages;
|
|
extern double bgwriter_lru_multiplier;
|
|
|
|
/* in buf_init.c */
|
|
extern PGDLLIMPORT char *BufferBlocks;
|
|
extern PGDLLIMPORT int32 *PrivateRefCount;
|
|
|
|
/* in localbuf.c */
|
|
extern PGDLLIMPORT int NLocBuffer;
|
|
extern PGDLLIMPORT Block *LocalBufferBlockPointers;
|
|
extern PGDLLIMPORT int32 *LocalRefCount;
|
|
|
|
/* special block number for ReadBuffer() */
|
|
#define P_NEW InvalidBlockNumber /* grow the file to get a new page */
|
|
|
|
/*
|
|
* Buffer content lock modes (mode argument for LockBuffer())
|
|
*/
|
|
#define BUFFER_LOCK_UNLOCK 0
|
|
#define BUFFER_LOCK_SHARE 1
|
|
#define BUFFER_LOCK_EXCLUSIVE 2
|
|
|
|
/*
|
|
* These routines are beaten on quite heavily, hence the macroization.
|
|
*/
|
|
|
|
/*
|
|
* BufferIsValid
|
|
* True iff the given buffer number is valid (either as a shared
|
|
* or local buffer).
|
|
*
|
|
* This is not quite the inverse of the BufferIsInvalid() macro, since this
|
|
* adds sanity rangechecks on the buffer number.
|
|
*
|
|
* Note: For a long time this was defined the same as BufferIsPinned,
|
|
* that is it would say False if you didn't hold a pin on the buffer.
|
|
* I believe this was bogus and served only to mask logic errors.
|
|
* Code should always know whether it has a buffer reference,
|
|
* independently of the pin state.
|
|
*/
|
|
#define BufferIsValid(bufnum) \
|
|
( \
|
|
(bufnum) != InvalidBuffer && \
|
|
(bufnum) >= -NLocBuffer && \
|
|
(bufnum) <= NBuffers \
|
|
)
|
|
|
|
/*
|
|
* BufferIsPinned
|
|
* True iff the buffer is pinned (also checks for valid buffer number).
|
|
*
|
|
* NOTE: what we check here is that *this* backend holds a pin on
|
|
* the buffer. We do not care whether some other backend does.
|
|
*/
|
|
#define BufferIsPinned(bufnum) \
|
|
( \
|
|
!BufferIsValid(bufnum) ? \
|
|
false \
|
|
: \
|
|
BufferIsLocal(bufnum) ? \
|
|
(LocalRefCount[-(bufnum) - 1] > 0) \
|
|
: \
|
|
(PrivateRefCount[(bufnum) - 1] > 0) \
|
|
)
|
|
|
|
/*
|
|
* BufferGetBlock
|
|
* Returns a reference to a disk page image associated with a buffer.
|
|
*
|
|
* Note:
|
|
* Assumes buffer is valid.
|
|
*/
|
|
#define BufferGetBlock(buffer) \
|
|
( \
|
|
AssertMacro(BufferIsValid(buffer)), \
|
|
BufferIsLocal(buffer) ? \
|
|
LocalBufferBlockPointers[-(buffer) - 1] \
|
|
: \
|
|
(Block) (BufferBlocks + ((Size) ((buffer) - 1)) * BLCKSZ) \
|
|
)
|
|
|
|
/*
|
|
* prototypes for functions in bufmgr.c
|
|
*/
|
|
extern Buffer ReadBuffer(Relation reln, BlockNumber blockNum);
|
|
extern Buffer ReadBufferWithStrategy(Relation reln, BlockNumber blockNum,
|
|
BufferAccessStrategy strategy);
|
|
extern Buffer ReadOrZeroBuffer(Relation reln, BlockNumber blockNum);
|
|
extern void ReleaseBuffer(Buffer buffer);
|
|
extern void UnlockReleaseBuffer(Buffer buffer);
|
|
extern void MarkBufferDirty(Buffer buffer);
|
|
extern void IncrBufferRefCount(Buffer buffer);
|
|
extern Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation,
|
|
BlockNumber blockNum);
|
|
|
|
extern void InitBufferPool(void);
|
|
extern void InitBufferPoolAccess(void);
|
|
extern void InitBufferPoolBackend(void);
|
|
extern char *ShowBufferUsage(void);
|
|
extern void ResetBufferUsage(void);
|
|
extern void AtEOXact_Buffers(bool isCommit);
|
|
extern void PrintBufferLeakWarning(Buffer buffer);
|
|
extern void CheckPointBuffers(int flags);
|
|
extern BlockNumber BufferGetBlockNumber(Buffer buffer);
|
|
extern BlockNumber RelationGetNumberOfBlocks(Relation relation);
|
|
extern void RelationTruncate(Relation rel, BlockNumber nblocks);
|
|
extern void FlushRelationBuffers(Relation rel);
|
|
extern void FlushDatabaseBuffers(Oid dbid);
|
|
extern void DropRelFileNodeBuffers(RelFileNode rnode, bool istemp,
|
|
BlockNumber firstDelBlock);
|
|
extern void DropDatabaseBuffers(Oid dbid);
|
|
|
|
#ifdef NOT_USED
|
|
extern void PrintPinnedBufs(void);
|
|
#endif
|
|
extern Size BufferShmemSize(void);
|
|
extern RelFileNode BufferGetFileNode(Buffer buffer);
|
|
|
|
extern void SetBufferCommitInfoNeedsSave(Buffer buffer);
|
|
|
|
extern void UnlockBuffers(void);
|
|
extern void LockBuffer(Buffer buffer, int mode);
|
|
extern bool ConditionalLockBuffer(Buffer buffer);
|
|
extern void LockBufferForCleanup(Buffer buffer);
|
|
extern bool ConditionalLockBufferForCleanup(Buffer buffer);
|
|
|
|
extern void AbortBufferIO(void);
|
|
|
|
extern void BufmgrCommit(void);
|
|
extern void BgBufferSync(void);
|
|
|
|
extern void AtProcExit_LocalBuffers(void);
|
|
|
|
/* in freelist.c */
|
|
extern BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype);
|
|
extern void FreeAccessStrategy(BufferAccessStrategy strategy);
|
|
|
|
#endif
|