PostgreSQL Source Code git master
bufmgr.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * bufmgr.h
4 * POSTGRES buffer manager definitions.
5 *
6 *
7 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
9 *
10 * src/include/storage/bufmgr.h
11 *
12 *-------------------------------------------------------------------------
13 */
14#ifndef BUFMGR_H
15#define BUFMGR_H
16
17#include "port/pg_iovec.h"
18#include "storage/aio_types.h"
19#include "storage/block.h"
20#include "storage/buf.h"
21#include "storage/bufpage.h"
23#include "utils/relcache.h"
24#include "utils/snapmgr.h"
25
26typedef void *Block;
27
28/*
29 * Possible arguments for GetAccessStrategy().
30 *
31 * If adding a new BufferAccessStrategyType, also add a new IOContext so
32 * IO statistics using this strategy are tracked.
33 */
35{
36 BAS_NORMAL, /* Normal random access */
37 BAS_BULKREAD, /* Large read-only scan (hint bit updates are
38 * ok) */
39 BAS_BULKWRITE, /* Large multi-block write (e.g. COPY IN) */
40 BAS_VACUUM, /* VACUUM */
42
43/* Possible modes for ReadBufferExtended() */
44typedef enum
45{
46 RBM_NORMAL, /* Normal read */
47 RBM_ZERO_AND_LOCK, /* Don't read from disk, caller will
48 * initialize. Also locks the page. */
49 RBM_ZERO_AND_CLEANUP_LOCK, /* Like RBM_ZERO_AND_LOCK, but locks the page
50 * in "cleanup" mode */
51 RBM_ZERO_ON_ERROR, /* Read, but return an all-zeros page on error */
52 RBM_NORMAL_NO_LOG, /* Don't log page as invalid during WAL
53 * replay; otherwise same as RBM_NORMAL */
55
56/*
57 * Type returned by PrefetchBuffer().
58 */
60{
61 Buffer recent_buffer; /* If valid, a hit (recheck needed!) */
62 bool initiated_io; /* If true, a miss resulting in async I/O */
64
65/*
66 * Flags influencing the behaviour of ExtendBufferedRel*
67 */
69{
70 /*
71 * Don't acquire extension lock. This is safe only if the relation isn't
72 * shared, an access exclusive lock is held or if this is the startup
73 * process.
74 */
76
77 /* Is this extension part of recovery? */
79
80 /*
81 * Should the fork be created if it does not currently exist? This likely
82 * only ever makes sense for relation forks.
83 */
85
86 /* Should the first (possibly only) return buffer be returned locked? */
87 EB_LOCK_FIRST = (1 << 3),
88
89 /* Should the smgr size cache be cleared? */
91
92 /* internal flags follow */
93 EB_LOCK_TARGET = (1 << 5),
95
96/* forward declared, to avoid including smgr.h here */
98
99/*
100 * Some functions identify relations either by relation or smgr +
101 * relpersistence, initialized via the BMR_REL()/BMR_SMGR() macros below.
102 * This allows us to use the same function for both recovery and normal
103 * operation. When BMR_REL is used, it's not valid to cache its rd_smgr here,
104 * because our pointer would be obsolete in case of relcache invalidation.
105 * For simplicity, use BMR_GET_SMGR to read the smgr.
106 */
108{
113
114#define BMR_REL(p_rel) \
115 ((BufferManagerRelation){.rel = p_rel})
116#define BMR_SMGR(p_smgr, p_relpersistence) \
117 ((BufferManagerRelation){.smgr = p_smgr, .relpersistence = p_relpersistence})
118#define BMR_GET_SMGR(bmr) \
119 (RelationIsValid((bmr).rel) ? RelationGetSmgr((bmr).rel) : (bmr).smgr)
120
121/* Zero out page if reading fails. */
122#define READ_BUFFERS_ZERO_ON_ERROR (1 << 0)
123/* Call smgrprefetch() if I/O necessary. */
124#define READ_BUFFERS_ISSUE_ADVICE (1 << 1)
125/* Don't treat page as invalid due to checksum failures. */
126#define READ_BUFFERS_IGNORE_CHECKSUM_FAILURES (1 << 2)
127/* IO will immediately be waited for */
128#define READ_BUFFERS_SYNCHRONOUSLY (1 << 3)
129
130
132{
133 /* The following members should be set by the caller. */
134 Relation rel; /* optional */
139
140 /*
141 * The following private members are private state for communication
142 * between StartReadBuffers() and WaitReadBuffers(), initialized only if
143 * an actual read is required, and should not be modified.
144 */
147 int flags;
152};
153
155
156/* to avoid having to expose buf_internals.h here */
158
159/* in globals.c ... this duplicates miscadmin.h */
160extern PGDLLIMPORT int NBuffers;
161
162/* in bufmgr.c */
166extern PGDLLIMPORT bool track_io_timing;
167
168#define DEFAULT_EFFECTIVE_IO_CONCURRENCY 16
169#define DEFAULT_MAINTENANCE_IO_CONCURRENCY 16
172
173#define MAX_IO_COMBINE_LIMIT PG_IOV_MAX
174#define DEFAULT_IO_COMBINE_LIMIT Min(MAX_IO_COMBINE_LIMIT, (128 * 1024) / BLCKSZ)
175extern PGDLLIMPORT int io_combine_limit; /* min of the two GUCs below */
178
182
185
186/* in buf_init.c */
187extern PGDLLIMPORT char *BufferBlocks;
188
189/* in localbuf.c */
190extern PGDLLIMPORT int NLocBuffer;
193
194/* upper limit for effective_io_concurrency */
195#define MAX_IO_CONCURRENCY 1000
196
197/* special block number for ReadBuffer() */
198#define P_NEW InvalidBlockNumber /* grow the file to get a new page */
199
200/*
201 * Buffer content lock modes (mode argument for LockBuffer())
202 */
203#define BUFFER_LOCK_UNLOCK 0
204#define BUFFER_LOCK_SHARE 1
205#define BUFFER_LOCK_EXCLUSIVE 2
206
207
208/*
209 * prototypes for functions in bufmgr.c
210 */
212 ForkNumber forkNum,
213 BlockNumber blockNum);
215 BlockNumber blockNum);
216extern bool ReadRecentBuffer(RelFileLocator rlocator, ForkNumber forkNum,
217 BlockNumber blockNum, Buffer recent_buffer);
218extern Buffer ReadBuffer(Relation reln, BlockNumber blockNum);
219extern Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum,
221 BufferAccessStrategy strategy);
223 ForkNumber forkNum, BlockNumber blockNum,
225 bool permanent);
226
227extern bool StartReadBuffer(ReadBuffersOperation *operation,
228 Buffer *buffer,
229 BlockNumber blocknum,
230 int flags);
231extern bool StartReadBuffers(ReadBuffersOperation *operation,
232 Buffer *buffers,
233 BlockNumber blockNum,
234 int *nblocks,
235 int flags);
236extern void WaitReadBuffers(ReadBuffersOperation *operation);
237
238extern void ReleaseBuffer(Buffer buffer);
239extern void UnlockReleaseBuffer(Buffer buffer);
240extern bool BufferIsLockedByMe(Buffer buffer);
241extern bool BufferIsLockedByMeInMode(Buffer buffer, int mode);
242extern bool BufferIsDirty(Buffer buffer);
243extern void MarkBufferDirty(Buffer buffer);
244extern void IncrBufferRefCount(Buffer buffer);
245extern void CheckBufferIsPinnedOnce(Buffer buffer);
246extern Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation,
247 BlockNumber blockNum);
248
250 ForkNumber forkNum,
251 BufferAccessStrategy strategy,
252 uint32 flags);
254 ForkNumber fork,
255 BufferAccessStrategy strategy,
256 uint32 flags,
257 uint32 extend_by,
258 Buffer *buffers,
259 uint32 *extended_by);
261 ForkNumber fork,
262 BufferAccessStrategy strategy,
263 uint32 flags,
264 BlockNumber extend_to,
266
267extern void InitBufferManagerAccess(void);
268extern void AtEOXact_Buffers(bool isCommit);
269#ifdef USE_ASSERT_CHECKING
270extern void AssertBufferLocksPermitCatalogRead(void);
271#endif
272extern char *DebugPrintBufferRefcount(Buffer buffer);
273extern void CheckPointBuffers(int flags);
276 ForkNumber forkNum);
277extern void FlushOneBuffer(Buffer buffer);
278extern void FlushRelationBuffers(Relation rel);
279extern void FlushRelationsAllBuffers(SMgrRelation *smgrs, int nrels);
280extern void CreateAndCopyRelationData(RelFileLocator src_rlocator,
281 RelFileLocator dst_rlocator,
282 bool permanent);
283extern void FlushDatabaseBuffers(Oid dbid);
284extern void DropRelationBuffers(SMgrRelation smgr_reln,
285 ForkNumber *forkNum,
286 int nforks, BlockNumber *firstDelBlock);
287extern void DropRelationsAllBuffers(SMgrRelation *smgr_reln,
288 int nlocators);
289extern void DropDatabaseBuffers(Oid dbid);
290
291#define RelationGetNumberOfBlocks(reln) \
292 RelationGetNumberOfBlocksInFork(reln, MAIN_FORKNUM)
293
294extern bool BufferIsPermanent(Buffer buffer);
296extern void BufferGetTag(Buffer buffer, RelFileLocator *rlocator,
297 ForkNumber *forknum, BlockNumber *blknum);
298
299extern void MarkBufferDirtyHint(Buffer buffer, bool buffer_std);
300
301extern void UnlockBuffers(void);
302extern void LockBuffer(Buffer buffer, int mode);
303extern bool ConditionalLockBuffer(Buffer buffer);
304extern void LockBufferForCleanup(Buffer buffer);
305extern bool ConditionalLockBufferForCleanup(Buffer buffer);
306extern bool IsBufferCleanupOK(Buffer buffer);
307extern bool HoldingBufferPinThatDelaysRecovery(void);
308
309extern bool BgBufferSync(WritebackContext *wb_context);
310
311extern uint32 GetPinLimit(void);
312extern uint32 GetLocalPinLimit(void);
313extern uint32 GetAdditionalPinLimit(void);
315extern void LimitAdditionalPins(uint32 *additional_pins);
316extern void LimitAdditionalLocalPins(uint32 *additional_pins);
317
318extern bool EvictUnpinnedBuffer(Buffer buf, bool *buffer_flushed);
319extern void EvictAllUnpinnedBuffers(int32 *buffers_evicted,
320 int32 *buffers_flushed,
321 int32 *buffers_skipped);
322extern void EvictRelUnpinnedBuffers(Relation rel,
323 int32 *buffers_evicted,
324 int32 *buffers_flushed,
325 int32 *buffers_skipped);
326
327/* in buf_init.c */
328extern void BufferManagerShmemInit(void);
329extern Size BufferManagerShmemSize(void);
330
331/* in localbuf.c */
332extern void AtProcExit_LocalBuffers(void);
333
334/* in freelist.c */
335
338 int ring_size_kb);
341
342extern void FreeAccessStrategy(BufferAccessStrategy strategy);
343
344
345/* inline functions */
346
347/*
348 * Although this header file is nominally backend-only, certain frontend
349 * programs like pg_waldump include it. For compilers that emit static
350 * inline functions even when they're unused, that leads to unsatisfied
351 * external references; hence hide these with #ifndef FRONTEND.
352 */
353
354#ifndef FRONTEND
355
356/*
357 * BufferIsValid
358 * True iff the given buffer number is valid (either as a shared
359 * or local buffer).
360 *
361 * Note: For a long time this was defined the same as BufferIsPinned,
362 * that is it would say False if you didn't hold a pin on the buffer.
363 * I believe this was bogus and served only to mask logic errors.
364 * Code should always know whether it has a buffer reference,
365 * independently of the pin state.
366 *
367 * Note: For a further long time this was not quite the inverse of the
368 * BufferIsInvalid() macro, in that it also did sanity checks to verify
369 * that the buffer number was in range. Most likely, this macro was
370 * originally intended only to be used in assertions, but its use has
371 * since expanded quite a bit, and the overhead of making those checks
372 * even in non-assert-enabled builds can be significant. Thus, we've
373 * now demoted the range checks to assertions within the macro itself.
374 */
375static inline bool
377{
378 Assert(bufnum <= NBuffers);
379 Assert(bufnum >= -NLocBuffer);
380
381 return bufnum != InvalidBuffer;
382}
383
384/*
385 * BufferGetBlock
386 * Returns a reference to a disk page image associated with a buffer.
387 *
388 * Note:
389 * Assumes buffer is valid.
390 */
391static inline Block
393{
394 Assert(BufferIsValid(buffer));
395
396 if (BufferIsLocal(buffer))
397 return LocalBufferBlockPointers[-buffer - 1];
398 else
399 return (Block) (BufferBlocks + ((Size) (buffer - 1)) * BLCKSZ);
400}
401
402/*
403 * BufferGetPageSize
404 * Returns the page size within a buffer.
405 *
406 * Notes:
407 * Assumes buffer is valid.
408 *
409 * The buffer can be a raw disk block and need not contain a valid
410 * (formatted) disk page.
411 */
412/* XXX should dig out of buffer descriptor */
413static inline Size
415{
416 Assert(BufferIsValid(buffer));
417 return (Size) BLCKSZ;
418}
419
420/*
421 * BufferGetPage
422 * Returns the page associated with a buffer.
423 */
424static inline Page
426{
427 return (Page) BufferGetBlock(buffer);
428}
429
430#endif /* FRONTEND */
431
432#endif /* BUFMGR_H */
uint32 BlockNumber
Definition: block.h:31
int Buffer
Definition: buf.h:23
#define InvalidBuffer
Definition: buf.h:25
#define BufferIsLocal(buffer)
Definition: buf.h:37
BufferAccessStrategyType
Definition: bufmgr.h:35
@ BAS_BULKREAD
Definition: bufmgr.h:37
@ BAS_NORMAL
Definition: bufmgr.h:36
@ BAS_VACUUM
Definition: bufmgr.h:40
@ BAS_BULKWRITE
Definition: bufmgr.h:39
void CheckBufferIsPinnedOnce(Buffer buffer)
Definition: bufmgr.c:5651
void FlushRelationsAllBuffers(SMgrRelation *smgrs, int nrels)
Definition: bufmgr.c:5030
struct BufferManagerRelation BufferManagerRelation
void IncrBufferRefCount(Buffer buffer)
Definition: bufmgr.c:5398
void DropDatabaseBuffers(Oid dbid)
Definition: bufmgr.c:4895
PGDLLIMPORT int effective_io_concurrency
Definition: bufmgr.c:155
BlockNumber BufferGetBlockNumber(Buffer buffer)
Definition: bufmgr.c:4223
PGDLLIMPORT const PgAioHandleCallbacks aio_shared_buffer_readv_cb
Definition: bufmgr.c:7448
struct SMgrRelationData * SMgrRelation
Definition: bufmgr.h:97
void DropRelationBuffers(SMgrRelation smgr_reln, ForkNumber *forkNum, int nforks, BlockNumber *firstDelBlock)
Definition: bufmgr.c:4545
Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation, BlockNumber blockNum)
Definition: bufmgr.c:3008
PrefetchBufferResult PrefetchBuffer(Relation reln, ForkNumber forkNum, BlockNumber blockNum)
Definition: bufmgr.c:653
bool BufferIsLockedByMeInMode(Buffer buffer, int mode)
Definition: bufmgr.c:2869
int GetAccessStrategyPinLimit(BufferAccessStrategy strategy)
Definition: freelist.c:609
bool StartReadBuffers(ReadBuffersOperation *operation, Buffer *buffers, BlockNumber blockNum, int *nblocks, int flags)
Definition: bufmgr.c:1470
void EvictAllUnpinnedBuffers(int32 *buffers_evicted, int32 *buffers_flushed, int32 *buffers_skipped)
Definition: bufmgr.c:6683
PGDLLIMPORT int bgwriter_flush_after
Definition: bufmgr.c:179
PGDLLIMPORT const PgAioHandleCallbacks aio_local_buffer_readv_cb
Definition: bufmgr.c:7457
void EvictRelUnpinnedBuffers(Relation rel, int32 *buffers_evicted, int32 *buffers_flushed, int32 *buffers_skipped)
Definition: bufmgr.c:6733
PGDLLIMPORT bool zero_damaged_pages
Definition: bufmgr.c:144
PGDLLIMPORT Block * LocalBufferBlockPointers
Definition: localbuf.c:48
bool IsBufferCleanupOK(Buffer buffer)
Definition: bufmgr.c:5915
PGDLLIMPORT int bgwriter_lru_maxpages
Definition: bufmgr.c:145
Buffer ExtendBufferedRel(BufferManagerRelation bmr, ForkNumber forkNum, BufferAccessStrategy strategy, uint32 flags)
Definition: bufmgr.c:845
uint32 GetAdditionalLocalPinLimit(void)
Definition: localbuf.c:315
static Page BufferGetPage(Buffer buffer)
Definition: bufmgr.h:425
void AtEOXact_Buffers(bool isCommit)
Definition: bufmgr.c:3990
BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype)
Definition: freelist.c:461
BlockNumber ExtendBufferedRelBy(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, uint32 extend_by, Buffer *buffers, uint32 *extended_by)
Definition: bufmgr.c:877
struct PrefetchBufferResult PrefetchBufferResult
Size BufferManagerShmemSize(void)
Definition: buf_init.c:153
static Block BufferGetBlock(Buffer buffer)
Definition: bufmgr.h:392
void CreateAndCopyRelationData(RelFileLocator src_rlocator, RelFileLocator dst_rlocator, bool permanent)
Definition: bufmgr.c:5242
PGDLLIMPORT int maintenance_io_concurrency
Definition: bufmgr.c:162
void DropRelationsAllBuffers(SMgrRelation *smgr_reln, int nlocators)
Definition: bufmgr.c:4665
Buffer ExtendBufferedRelTo(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, BlockNumber extend_to, ReadBufferMode mode)
Definition: bufmgr.c:906
void AtProcExit_LocalBuffers(void)
Definition: localbuf.c:1014
PGDLLIMPORT bool track_io_timing
Definition: bufmgr.c:147
void BufferGetTag(Buffer buffer, RelFileLocator *rlocator, ForkNumber *forknum, BlockNumber *blknum)
Definition: bufmgr.c:4244
PGDLLIMPORT int NBuffers
Definition: globals.c:142
void LimitAdditionalLocalPins(uint32 *additional_pins)
Definition: localbuf.c:323
uint32 GetLocalPinLimit(void)
Definition: localbuf.c:307
BufferAccessStrategy GetAccessStrategyWithSize(BufferAccessStrategyType btype, int ring_size_kb)
Definition: freelist.c:546
char * DebugPrintBufferRefcount(Buffer buffer)
Definition: bufmgr.c:4166
void CheckPointBuffers(int flags)
Definition: bufmgr.c:4209
bool BufferIsDirty(Buffer buffer)
Definition: bufmgr.c:2911
bool BgBufferSync(WritebackContext *wb_context)
Definition: bufmgr.c:3622
bool BufferIsPermanent(Buffer buffer)
Definition: bufmgr.c:4469
void UnlockBuffers(void)
Definition: bufmgr.c:5573
void * Block
Definition: bufmgr.h:26
PGDLLIMPORT int io_combine_limit_guc
Definition: bufmgr.c:171
int GetAccessStrategyBufferCount(BufferAccessStrategy strategy)
Definition: freelist.c:586
PrefetchBufferResult PrefetchSharedBuffer(SMgrRelation smgr_reln, ForkNumber forkNum, BlockNumber blockNum)
Definition: bufmgr.c:563
static Size BufferGetPageSize(Buffer buffer)
Definition: bufmgr.h:414
bool ConditionalLockBuffer(Buffer buffer)
Definition: bufmgr.c:5630
BlockNumber RelationGetNumberOfBlocksInFork(Relation relation, ForkNumber forkNum)
Definition: bufmgr.c:4437
void BufferManagerShmemInit(void)
Definition: buf_init.c:68
void ReleaseBuffer(Buffer buffer)
Definition: bufmgr.c:5366
void FreeAccessStrategy(BufferAccessStrategy strategy)
Definition: freelist.c:643
bool BufferIsLockedByMe(Buffer buffer)
Definition: bufmgr.c:2843
PGDLLIMPORT int32 * LocalRefCount
Definition: localbuf.c:49
XLogRecPtr BufferGetLSNAtomic(Buffer buffer)
Definition: bufmgr.c:4499
bool HoldingBufferPinThatDelaysRecovery(void)
Definition: bufmgr.c:5831
void UnlockReleaseBuffer(Buffer buffer)
Definition: bufmgr.c:5383
void WaitReadBuffers(ReadBuffersOperation *operation)
Definition: bufmgr.c:1613
void MarkBufferDirty(Buffer buffer)
Definition: bufmgr.c:2943
PGDLLIMPORT int io_combine_limit
Definition: bufmgr.c:170
void LimitAdditionalPins(uint32 *additional_pins)
Definition: bufmgr.c:2513
PGDLLIMPORT int NLocBuffer
Definition: localbuf.c:45
void LockBufferForCleanup(Buffer buffer)
Definition: bufmgr.c:5684
void LockBuffer(Buffer buffer, int mode)
Definition: bufmgr.c:5604
void MarkBufferDirtyHint(Buffer buffer, bool buffer_std)
Definition: bufmgr.c:5430
void FlushRelationBuffers(Relation rel)
Definition: bufmgr.c:4942
ExtendBufferedFlags
Definition: bufmgr.h:69
@ EB_LOCK_TARGET
Definition: bufmgr.h:93
@ EB_CLEAR_SIZE_CACHE
Definition: bufmgr.h:90
@ EB_PERFORMING_RECOVERY
Definition: bufmgr.h:78
@ EB_CREATE_FORK_IF_NEEDED
Definition: bufmgr.h:84
@ EB_SKIP_EXTENSION_LOCK
Definition: bufmgr.h:75
@ EB_LOCK_FIRST
Definition: bufmgr.h:87
bool EvictUnpinnedBuffer(Buffer buf, bool *buffer_flushed)
Definition: bufmgr.c:6654
Buffer ReadBufferWithoutRelcache(RelFileLocator rlocator, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy, bool permanent)
Definition: bufmgr.c:829
PGDLLIMPORT int backend_flush_after
Definition: bufmgr.c:180
PGDLLIMPORT double bgwriter_lru_multiplier
Definition: bufmgr.c:146
bool ReadRecentBuffer(RelFileLocator rlocator, ForkNumber forkNum, BlockNumber blockNum, Buffer recent_buffer)
Definition: bufmgr.c:684
void FlushDatabaseBuffers(Oid dbid)
Definition: bufmgr.c:5306
PGDLLIMPORT int checkpoint_flush_after
Definition: bufmgr.c:178
bool StartReadBuffer(ReadBuffersOperation *operation, Buffer *buffer, BlockNumber blocknum, int flags)
Definition: bufmgr.c:1489
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
Definition: bufmgr.c:792
void InitBufferManagerAccess(void)
Definition: bufmgr.c:4007
PGDLLIMPORT char * BufferBlocks
Definition: buf_init.c:22
uint32 GetAdditionalPinLimit(void)
Definition: bufmgr.c:2487
PGDLLIMPORT int io_max_combine_limit
Definition: bufmgr.c:172
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
Definition: bufmgr.c:745
ReadBufferMode
Definition: bufmgr.h:45
@ RBM_ZERO_ON_ERROR
Definition: bufmgr.h:51
@ RBM_ZERO_AND_CLEANUP_LOCK
Definition: bufmgr.h:49
@ RBM_ZERO_AND_LOCK
Definition: bufmgr.h:47
@ RBM_NORMAL
Definition: bufmgr.h:46
@ RBM_NORMAL_NO_LOG
Definition: bufmgr.h:52
bool ConditionalLockBufferForCleanup(Buffer buffer)
Definition: bufmgr.c:5857
uint32 GetPinLimit(void)
Definition: bufmgr.c:2475
void FlushOneBuffer(Buffer buffer)
Definition: bufmgr.c:5346
static bool BufferIsValid(Buffer bufnum)
Definition: bufmgr.h:376
PageData * Page
Definition: bufpage.h:81
#define PGDLLIMPORT
Definition: c.h:1320
int16_t int16
Definition: c.h:538
int32_t int32
Definition: c.h:539
uint32_t uint32
Definition: c.h:543
size_t Size
Definition: c.h:615
Assert(PointerIsAligned(start, uint64))
static PgChecksumMode mode
Definition: pg_checksums.c:56
static char * buf
Definition: pg_test_fsync.c:72
unsigned int Oid
Definition: postgres_ext.h:32
ForkNumber
Definition: relpath.h:56
SMgrRelation smgr
Definition: bufmgr.h:110
Buffer recent_buffer
Definition: bufmgr.h:61
ForkNumber forknum
Definition: bufmgr.h:137
PgAioWaitRef io_wref
Definition: bufmgr.h:150
Buffer * buffers
Definition: bufmgr.h:145
SMgrRelation smgr
Definition: bufmgr.h:135
BufferAccessStrategy strategy
Definition: bufmgr.h:138
BlockNumber blocknum
Definition: bufmgr.h:146
PgAioReturn io_return
Definition: bufmgr.h:151
uint64 XLogRecPtr
Definition: xlogdefs.h:21