22#define NUM_BUFFERCACHE_PAGES_MIN_ELEM 8
23#define NUM_BUFFERCACHE_PAGES_ELEM 9
24#define NUM_BUFFERCACHE_SUMMARY_ELEM 5
25#define NUM_BUFFERCACHE_USAGE_COUNTS_ELEM 4
26#define NUM_BUFFERCACHE_EVICT_ELEM 2
27#define NUM_BUFFERCACHE_EVICT_RELATION_ELEM 3
28#define NUM_BUFFERCACHE_EVICT_ALL_ELEM 3
29#define NUM_BUFFERCACHE_MARK_DIRTY_ELEM 2
30#define NUM_BUFFERCACHE_MARK_DIRTY_RELATION_ELEM 3
31#define NUM_BUFFERCACHE_MARK_DIRTY_ALL_ELEM 3
33#define NUM_BUFFERCACHE_OS_PAGES_ELEM 3
36 .
name =
"pg_buffercache",
100 elog(
ERROR,
"return type must be a row type");
104 elog(
ERROR,
"incorrect number of output arguments");
141 reltablespace =
bufHdr->tag.spcOid;
144 blocknum =
bufHdr->tag.blockNum;
254 elog(
ERROR,
"libnuma initialization failed or NUMA is not supported on this platform");
307 for (
char *ptr = startptr; ptr < endptr; ptr +=
os_page_size)
329 elog(
ERROR,
"failed NUMA pages inquiry: %m");
343 elog(
ERROR,
"return type must be a row type");
346 elog(
ERROR,
"incorrect number of output arguments");
359 fctx->include_numa = include_numa;
380 elog(
DEBUG1,
"NUMA: page-faulting the buffercache for proper NUMA readouts");
424 fctx->record[
idx].bufferid = bufferid;
425 fctx->record[
idx].page_num = page_num;
465 if (
fctx->include_numa)
468 if (
fctx->record[
i].numa_node >= 0)
536 elog(
ERROR,
"return type must be a row type");
569 memset(nulls, 0,
sizeof(nulls));
639 errmsg(
"must be superuser to use %s()",
659 elog(
ERROR,
"return type must be a row type");
695 elog(
ERROR,
"return type must be a row type");
706 errmsg(
"relation uses local buffers, %s() is intended to be used for shared buffers only",
707 "pg_buffercache_evict_relation")));
742 elog(
ERROR,
"return type must be a row type");
776 elog(
ERROR,
"return type must be a row type");
812 elog(
ERROR,
"return type must be a row type");
823 errmsg(
"relation uses local buffers, %s() is intended to be used for shared buffers only",
824 "pg_buffercache_mark_dirty_relation")));
858 elog(
ERROR,
"return type must be a row type");
Datum idx(PG_FUNCTION_ARGS)
static uint64 pg_atomic_read_u64(volatile pg_atomic_uint64 *ptr)
#define InvalidBlockNumber
static Datum values[MAXATTR]
#define BM_MAX_USAGE_COUNT
static ForkNumber BufTagGetForkNum(const BufferTag *tag)
static RelFileNumber BufTagGetRelNumber(const BufferTag *tag)
static void UnlockBufHdr(BufferDesc *desc)
#define BUF_STATE_GET_USAGECOUNT(state)
#define BUF_STATE_GET_REFCOUNT(state)
static BufferDesc * GetBufferDescriptor(uint32 id)
static Buffer BufferDescriptorGetBuffer(const BufferDesc *bdesc)
void EvictAllUnpinnedBuffers(int32 *buffers_evicted, int32 *buffers_flushed, int32 *buffers_skipped)
void EvictRelUnpinnedBuffers(Relation rel, int32 *buffers_evicted, int32 *buffers_flushed, int32 *buffers_skipped)
uint64 LockBufHdr(BufferDesc *desc)
void MarkDirtyAllUnpinnedBuffers(int32 *buffers_dirtied, int32 *buffers_already_dirty, int32 *buffers_skipped)
bool MarkDirtyUnpinnedBuffer(Buffer buf, bool *buffer_already_dirty)
bool EvictUnpinnedBuffer(Buffer buf, bool *buffer_flushed)
void MarkDirtyRelUnpinnedBuffers(Relation rel, int32 *buffers_dirtied, int32 *buffers_already_dirty, int32 *buffers_skipped)
static Block BufferGetBlock(Buffer buffer)
#define TYPEALIGN(ALIGNVAL, LEN)
#define Assert(condition)
#define TYPEALIGN_DOWN(ALIGNVAL, LEN)
int errcode(int sqlerrcode)
#define ereport(elevel,...)
TupleDesc BlessTupleDesc(TupleDesc tupdesc)
#define palloc_object(type)
#define palloc_array(type, count)
#define palloc0_array(type, count)
#define PG_MODULE_MAGIC_EXT(...)
#define PG_FUNCTION_INFO_V1(funcname)
#define PG_GETARG_INT32(n)
#define PG_GETARG_BOOL(n)
#define PG_RETURN_DATUM(x)
void InitMaterializedSRF(FunctionCallInfo fcinfo, uint32 flags)
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
#define SRF_IS_FIRSTCALL()
#define SRF_PERCALL_SETUP()
#define SRF_RETURN_NEXT(_funcctx, _result)
#define SRF_FIRSTCALL_INIT()
static Datum HeapTupleGetDatum(const HeapTupleData *tuple)
#define SRF_RETURN_DONE(_funcctx)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
MemoryContext CurrentMemoryContext
void * MemoryContextAllocHuge(MemoryContext context, Size size)
#define CHECK_FOR_INTERRUPTS()
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Datum pg_buffercache_os_pages(PG_FUNCTION_ARGS)
Datum pg_buffercache_evict_relation(PG_FUNCTION_ARGS)
#define NUM_BUFFERCACHE_USAGE_COUNTS_ELEM
#define NUM_BUFFERCACHE_OS_PAGES_ELEM
Datum pg_buffercache_evict(PG_FUNCTION_ARGS)
Datum pg_buffercache_mark_dirty_relation(PG_FUNCTION_ARGS)
Datum pg_buffercache_summary(PG_FUNCTION_ARGS)
static void pg_buffercache_superuser_check(char *func_name)
Datum pg_buffercache_usage_counts(PG_FUNCTION_ARGS)
#define NUM_BUFFERCACHE_SUMMARY_ELEM
Datum pg_buffercache_pages(PG_FUNCTION_ARGS)
#define NUM_BUFFERCACHE_EVICT_ELEM
#define NUM_BUFFERCACHE_PAGES_MIN_ELEM
#define NUM_BUFFERCACHE_EVICT_ALL_ELEM
Datum pg_buffercache_evict_all(PG_FUNCTION_ARGS)
#define NUM_BUFFERCACHE_MARK_DIRTY_RELATION_ELEM
#define NUM_BUFFERCACHE_PAGES_ELEM
#define NUM_BUFFERCACHE_MARK_DIRTY_ELEM
#define NUM_BUFFERCACHE_MARK_DIRTY_ALL_ELEM
Datum pg_buffercache_mark_dirty_all(PG_FUNCTION_ARGS)
Datum pg_buffercache_mark_dirty(PG_FUNCTION_ARGS)
Datum pg_buffercache_numa_pages(PG_FUNCTION_ARGS)
static bool firstNumaTouch
static Datum pg_buffercache_os_pages_internal(FunctionCallInfo fcinfo, bool include_numa)
#define NUM_BUFFERCACHE_EVICT_RELATION_ELEM
#define pg_numa_touch_mem_if_required(ptr)
PGDLLIMPORT int pg_numa_query_pages(int pid, unsigned long count, void **pages, int *status)
PGDLLIMPORT int pg_numa_init(void)
static char buf[DEFAULT_XLOG_SEG_SIZE]
static Datum Int64GetDatum(int64 X)
static Datum Int16GetDatum(int16 X)
static Datum UInt16GetDatum(uint16 X)
static Datum BoolGetDatum(bool X)
static Datum ObjectIdGetDatum(Oid X)
static Datum Float8GetDatum(float8 X)
static Datum Int32GetDatum(int32 X)
#define RelationUsesLocalBuffers(relation)
Size pg_get_shmem_pagesize(void)
void relation_close(Relation relation, LOCKMODE lockmode)
Relation relation_open(Oid relationId, LOCKMODE lockmode)
BufferCacheOsPagesRec * record
TupleDesc CreateTemplateTupleDesc(int natts)
void TupleDescFinalize(TupleDesc tupdesc)
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc, const Datum *values, const bool *isnull)