PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
slru.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * slru.h
4 * Simple LRU buffering for transaction status logfiles
5 *
6 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 * src/include/access/slru.h
10 *
11 *-------------------------------------------------------------------------
12 */
13#ifndef SLRU_H
14#define SLRU_H
15
16#include "access/xlogdefs.h"
17#include "storage/lwlock.h"
18#include "storage/sync.h"
19
20/*
21 * To avoid overflowing internal arithmetic and the size_t data type, the
22 * number of buffers must not exceed this number.
23 */
24#define SLRU_MAX_ALLOWED_BUFFERS ((1024 * 1024 * 1024) / BLCKSZ)
25
26/*
27 * Page status codes. Note that these do not include the "dirty" bit.
28 * page_dirty can be true only in the VALID or WRITE_IN_PROGRESS states;
29 * in the latter case it implies that the page has been re-dirtied since
30 * the write started.
31 */
32typedef enum
33{
34 SLRU_PAGE_EMPTY, /* buffer is not in use */
35 SLRU_PAGE_READ_IN_PROGRESS, /* page is being read in */
36 SLRU_PAGE_VALID, /* page is valid and not being written */
37 SLRU_PAGE_WRITE_IN_PROGRESS, /* page is being written out */
39
40/*
41 * Shared-memory state
42 *
43 * SLRU bank locks are used to protect access to the other fields, except
44 * latest_page_number, which uses atomics; see comment in slru.c.
45 */
46typedef struct SlruSharedData
47{
48 /* Number of buffers managed by this SLRU structure */
50
51 /*
52 * Arrays holding info for each buffer slot. Page number is undefined
53 * when status is EMPTY, as is page_lru_count.
54 */
60
61 /* The buffer_locks protects the I/O on each buffer slots */
63
64 /* Locks to protect the in memory buffer slot access in SLRU bank. */
66
67 /*----------
68 * A bank-wise LRU counter is maintained because we do a victim buffer
69 * search within a bank. Furthermore, manipulating an individual bank
70 * counter avoids frequent cache invalidation since we update it every time
71 * we access the page.
72 *
73 * We mark a page "most recently used" by setting
74 * page_lru_count[slotno] = ++bank_cur_lru_count[bankno];
75 * The oldest page in the bank is therefore the one with the highest value
76 * of
77 * bank_cur_lru_count[bankno] - page_lru_count[slotno]
78 * The counts will eventually wrap around, but this calculation still
79 * works as long as no page's age exceeds INT_MAX counts.
80 *----------
81 */
83
84 /*
85 * Optional array of WAL flush LSNs associated with entries in the SLRU
86 * pages. If not zero/NULL, we must flush WAL before writing pages (true
87 * for pg_xact, false for everything else). group_lsn[] has
88 * lsn_groups_per_page entries per buffer slot, each containing the
89 * highest LSN known for a contiguous group of SLRU entries on that slot's
90 * page.
91 */
94
95 /*
96 * latest_page_number is the page number of the current end of the log;
97 * this is not critical data, since we use it only to avoid swapping out
98 * the latest page.
99 */
101
102 /* SLRU's index for statistics purposes (might not be unique) */
105
107
108/*
109 * SlruCtlData is an unshared structure that points to the active information
110 * in shared memory.
111 */
112typedef struct SlruCtlData
113{
115
116 /* Number of banks in this SLRU. */
118
119 /*
120 * If true, use long segment file names. Otherwise, use short file names.
121 *
122 * For details about the file name format, see SlruFileName().
123 */
125
126 /*
127 * Which sync handler function to use when handing sync requests over to
128 * the checkpointer. SYNC_HANDLER_NONE to disable fsync (eg pg_notify).
129 */
131
132 /*
133 * Decide whether a page is "older" for truncation and as a hint for
134 * evicting pages in LRU order. Return true if every entry of the first
135 * argument is older than every entry of the second argument. Note that
136 * !PagePrecedes(a,b) && !PagePrecedes(b,a) need not imply a==b; it also
137 * arises when some entries are older and some are not. For SLRUs using
138 * SimpleLruTruncate(), this must use modular arithmetic. (For others,
139 * the behavior of this callback has no functional implications.) Use
140 * SlruPagePrecedesUnitTests() in SLRUs meeting its criteria.
141 */
143
144 /*
145 * Dir is set during SimpleLruInit and does not change thereafter. Since
146 * it's always the same, it doesn't need to be in shared memory.
147 */
148 char Dir[64];
150
152
153/*
154 * Get the SLRU bank lock for given SlruCtl and the pageno.
155 *
156 * This lock needs to be acquired to access the slru buffer slots in the
157 * respective bank.
158 */
159static inline LWLock *
161{
162 int bankno;
163
164 bankno = pageno % ctl->nbanks;
165 return &(ctl->shared->bank_locks[bankno].lock);
166}
167
168extern Size SimpleLruShmemSize(int nslots, int nlsns);
169extern int SimpleLruAutotuneBuffers(int divisor, int max);
170extern void SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns,
171 const char *subdir, int buffer_tranche_id,
172 int bank_tranche_id, SyncRequestHandler sync_handler,
173 bool long_segment_names);
174extern int SimpleLruZeroPage(SlruCtl ctl, int64 pageno);
175extern void SimpleLruZeroAndWritePage(SlruCtl ctl, int64 pageno);
176extern int SimpleLruReadPage(SlruCtl ctl, int64 pageno, bool write_ok,
177 TransactionId xid);
179 TransactionId xid);
180extern void SimpleLruWritePage(SlruCtl ctl, int slotno);
181extern void SimpleLruWriteAll(SlruCtl ctl, bool allow_redirtied);
182#ifdef USE_ASSERT_CHECKING
183extern void SlruPagePrecedesUnitTests(SlruCtl ctl, int per_page);
184#else
185#define SlruPagePrecedesUnitTests(ctl, per_page) do {} while (0)
186#endif
187extern void SimpleLruTruncate(SlruCtl ctl, int64 cutoffPage);
189
190typedef bool (*SlruScanCallback) (SlruCtl ctl, char *filename, int64 segpage,
191 void *data);
193extern void SlruDeleteSegment(SlruCtl ctl, int64 segno);
194
195extern int SlruSyncFileTag(SlruCtl ctl, const FileTag *ftag, char *path);
196
197/* SlruScanDirectory public callbacks */
199 int64 segpage, void *data);
200extern bool SlruScanDirCbDeleteAll(SlruCtl ctl, char *filename, int64 segpage,
201 void *data);
202extern bool check_slru_buffers(const char *name, int *newval);
203
204#endif /* SLRU_H */
int64_t int64
Definition: c.h:539
uint16_t uint16
Definition: c.h:541
uint32 TransactionId
Definition: c.h:661
size_t Size
Definition: c.h:614
#define newval
const void * data
static char * filename
Definition: pg_dumpall.c:120
tree ctl
Definition: radixtree.h:1838
void SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, const char *subdir, int buffer_tranche_id, int bank_tranche_id, SyncRequestHandler sync_handler, bool long_segment_names)
Definition: slru.c:252
static LWLock * SimpleLruGetBankLock(SlruCtl ctl, int64 pageno)
Definition: slru.h:160
SlruSharedData * SlruShared
Definition: slru.h:106
int SimpleLruReadPage_ReadOnly(SlruCtl ctl, int64 pageno, TransactionId xid)
Definition: slru.c:630
#define SlruPagePrecedesUnitTests(ctl, per_page)
Definition: slru.h:185
void SimpleLruWritePage(SlruCtl ctl, int slotno)
Definition: slru.c:757
bool(* SlruScanCallback)(SlruCtl ctl, char *filename, int64 segpage, void *data)
Definition: slru.h:190
void SimpleLruWriteAll(SlruCtl ctl, bool allow_redirtied)
Definition: slru.c:1347
int SimpleLruAutotuneBuffers(int divisor, int max)
Definition: slru.c:231
bool SimpleLruDoesPhysicalPageExist(SlruCtl ctl, int64 pageno)
Definition: slru.c:771
void SlruDeleteSegment(SlruCtl ctl, int64 segno)
Definition: slru.c:1551
struct SlruCtlData SlruCtlData
bool SlruScanDirectory(SlruCtl ctl, SlruScanCallback callback, void *data)
Definition: slru.c:1816
bool SlruScanDirCbDeleteAll(SlruCtl ctl, char *filename, int64 segpage, void *data)
Definition: slru.c:1769
int SimpleLruReadPage(SlruCtl ctl, int64 pageno, bool write_ok, TransactionId xid)
Definition: slru.c:527
int SlruSyncFileTag(SlruCtl ctl, const FileTag *ftag, char *path)
Definition: slru.c:1856
struct SlruSharedData SlruSharedData
SlruCtlData * SlruCtl
Definition: slru.h:151
int SimpleLruZeroPage(SlruCtl ctl, int64 pageno)
Definition: slru.c:375
void SimpleLruZeroAndWritePage(SlruCtl ctl, int64 pageno)
Definition: slru.c:444
void SimpleLruTruncate(SlruCtl ctl, int64 cutoffPage)
Definition: slru.c:1433
SlruPageStatus
Definition: slru.h:33
@ SLRU_PAGE_VALID
Definition: slru.h:36
@ SLRU_PAGE_WRITE_IN_PROGRESS
Definition: slru.h:37
@ SLRU_PAGE_READ_IN_PROGRESS
Definition: slru.h:35
@ SLRU_PAGE_EMPTY
Definition: slru.h:34
Size SimpleLruShmemSize(int nslots, int nlsns)
Definition: slru.c:198
bool SlruScanDirCbReportPresence(SlruCtl ctl, char *filename, int64 segpage, void *data)
Definition: slru.c:1737
bool check_slru_buffers(const char *name, int *newval)
Definition: slru.c:355
Definition: sync.h:51
Definition: lwlock.h:42
bool(* PagePrecedes)(int64, int64)
Definition: slru.h:142
bool long_segment_names
Definition: slru.h:124
SyncRequestHandler sync_handler
Definition: slru.h:130
uint16 nbanks
Definition: slru.h:117
SlruShared shared
Definition: slru.h:114
char Dir[64]
Definition: slru.h:148
int slru_stats_idx
Definition: slru.h:103
int64 * page_number
Definition: slru.h:58
int num_slots
Definition: slru.h:49
LWLockPadded * bank_locks
Definition: slru.h:65
int * page_lru_count
Definition: slru.h:59
pg_atomic_uint64 latest_page_number
Definition: slru.h:100
XLogRecPtr * group_lsn
Definition: slru.h:92
int * bank_cur_lru_count
Definition: slru.h:82
int lsn_groups_per_page
Definition: slru.h:93
SlruPageStatus * page_status
Definition: slru.h:56
bool * page_dirty
Definition: slru.h:57
LWLockPadded * buffer_locks
Definition: slru.h:62
char ** page_buffer
Definition: slru.h:55
SyncRequestHandler
Definition: sync.h:36
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)
Definition: test_ifaddrs.c:46
const char * name
uint64 XLogRecPtr
Definition: xlogdefs.h:21