94 if (
ctl->long_segment_names)
114 (
unsigned int) segno);
124#define MAX_WRITEALL_BUFFERS 16
143#define SLRU_BANK_BITSHIFT 4
144#define SLRU_BANK_SIZE (1 << SLRU_BANK_BITSHIFT)
149#define SlotGetBankNumber(slotno) ((slotno) >> SLRU_BANK_BITSHIFT)
157#define INIT_SLRUFILETAG(a,xx_handler,xx_segno) \
159 memset(&(a), 0, sizeof(FileTag)), \
160 (a).handler = (xx_handler), \
161 (a).segno = (xx_segno) \
288 ptr = (
char *) shared;
291 offset +=
MAXALIGN(nslots *
sizeof(
char *));
295 offset +=
MAXALIGN(nslots *
sizeof(
bool));
299 offset +=
MAXALIGN(nslots *
sizeof(
int));
307 offset +=
MAXALIGN(nbanks *
sizeof(
int));
348 ctl->shared = shared;
349 ctl->sync_handler = sync_handler;
350 ctl->long_segment_names = long_segment_names;
351 ctl->nbanks = nbanks;
729 for (
int i = 0;
i <
fdata->num_files;
i++)
865 (
errmsg(
"file \"%s\" doesn't exist, reading as zeroes",
966 for (
int i = 0;
i <
fdata->num_files;
i++)
1094 errmsg(
"could not open file \"%s\": %m", path),
1100 errmsg(
"could not seek in file \"%s\" to offset %d: %m",
1108 errmsg(
"could not read from file \"%s\" at offset %d: %m",
1113 (
errmsg(
"could not read from file \"%s\" at offset %d: read too few bytes",
1121 errmsg(
"Could not write to file \"%s\" at offset %d: %m",
1126 (
errmsg(
"Could not write to file \"%s\" at offset %d: wrote too few bytes.",
1133 errmsg(
"could not fsync file \"%s\": %m",
1140 errmsg(
"could not close file \"%s\": %m",
1146 elog(
ERROR,
"unrecognized SimpleLru error cause: %d",
1369 fdata.num_files = 0;
1411 for (
int i = 0;
i <
fdata.num_files;
i++)
1467 (
errmsg(
"could not truncate directory \"%s\": apparent wraparound",
1646#ifdef USE_ASSERT_CHECKING
1696 oldestXact -= 1U << 31;
1712 oldestXact -= 1U << 31;
1793 if (
ctl->long_segment_names)
1805 return (
len == 4 ||
len == 5 ||
len == 6);
1826 bool retval =
false;
1845 elog(
DEBUG2,
"SlruScanDirectory invoking callback on %s/%s",
static void pg_atomic_write_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
static void pg_atomic_init_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
static uint64 pg_atomic_read_u64(volatile pg_atomic_uint64 *ptr)
#define Assert(condition)
#define MemSet(start, val, len)
int errcode_for_file_access(void)
int int errmsg_internal(const char *fmt,...) pg_attribute_printf(1
#define ereport(elevel,...)
int CloseTransientFile(int fd)
void fsync_fname(const char *fname, bool isdir)
int data_sync_elevel(int elevel)
DIR * AllocateDir(const char *dirname)
struct dirent * ReadDir(DIR *dir, const char *dirname)
int OpenTransientFile(const char *fileName, int fileFlags)
#define GUC_check_errdetail
bool LWLockHeldByMe(LWLock *lock)
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
bool LWLockHeldByMeInMode(LWLock *lock, LWLockMode mode)
void LWLockRelease(LWLock *lock)
void LWLockInitialize(LWLock *lock, int tranche_id)
bool LWLockConditionalAcquire(LWLock *lock, LWLockMode mode)
#define START_CRIT_SECTION()
#define END_CRIT_SECTION()
#define SLRU_PAGES_PER_SEGMENT
void pgstat_count_slru_blocks_zeroed(int slru_idx)
void pgstat_count_slru_blocks_hit(int slru_idx)
void pgstat_count_slru_truncate(int slru_idx)
void pgstat_count_slru_blocks_read(int slru_idx)
void pgstat_count_slru_blocks_written(int slru_idx)
void pgstat_count_slru_flush(int slru_idx)
void pgstat_count_slru_blocks_exists(int slru_idx)
PgStat_CheckpointerStats PendingCheckpointerStats
int pgstat_get_slru_index(const char *name)
size_t strlcpy(char *dst, const char *src, size_t siz)
static int fd(const char *x, int i)
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
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)
static int SlruFileName(SlruCtl ctl, char *path, int64 segno)
static bool SlruPhysicalReadPage(SlruCtl ctl, int64 pageno, int slotno)
#define INIT_SLRUFILETAG(a, xx_handler, xx_segno)
void SimpleLruWritePage(SlruCtl ctl, int slotno)
void SimpleLruWriteAll(SlruCtl ctl, bool allow_redirtied)
static bool SlruMayDeleteSegment(SlruCtl ctl, int64 segpage, int64 cutoffPage)
static void SimpleLruZeroLSNs(SlruCtl ctl, int slotno)
int SimpleLruAutotuneBuffers(int divisor, int max)
static void SlruReportIOError(SlruCtl ctl, int64 pageno, const void *opaque_data)
static bool SlruPhysicalWritePage(SlruCtl ctl, int64 pageno, int slotno, SlruWriteAll fdata)
static bool SlruCorrectSegmentFilenameLength(SlruCtl ctl, size_t len)
static SlruErrorCause slru_errcause
#define MAX_WRITEALL_BUFFERS
int SimpleLruReadPage(SlruCtl ctl, int64 pageno, bool write_ok, const void *opaque_data)
static void SimpleLruWaitIO(SlruCtl ctl, int slotno)
bool SimpleLruDoesPhysicalPageExist(SlruCtl ctl, int64 pageno)
void SlruDeleteSegment(SlruCtl ctl, int64 segno)
static void SlruInternalWritePage(SlruCtl ctl, int slotno, SlruWriteAll fdata)
bool SlruScanDirectory(SlruCtl ctl, SlruScanCallback callback, void *data)
bool SlruScanDirCbDeleteAll(SlruCtl ctl, char *filename, int64 segpage, void *data)
int SlruSyncFileTag(SlruCtl ctl, const FileTag *ftag, char *path)
static int SlruSelectLRUPage(SlruCtl ctl, int64 pageno)
#define SlotGetBankNumber(slotno)
int SimpleLruZeroPage(SlruCtl ctl, int64 pageno)
void SimpleLruZeroAndWritePage(SlruCtl ctl, int64 pageno)
void SimpleLruTruncate(SlruCtl ctl, int64 cutoffPage)
static void SlruInternalDeleteSegment(SlruCtl ctl, int64 segno)
int SimpleLruReadPage_ReadOnly(SlruCtl ctl, int64 pageno, const void *opaque_data)
struct SlruWriteAllData * SlruWriteAll
Size SimpleLruShmemSize(int nslots, int nlsns)
bool SlruScanDirCbReportPresence(SlruCtl ctl, char *filename, int64 segpage, void *data)
static bool SlruScanDirCbDeleteCutoff(SlruCtl ctl, char *filename, int64 segpage, void *data)
static void SlruRecentlyUsed(SlruShared shared, int slotno)
bool check_slru_buffers(const char *name, int *newval)
static LWLock * SimpleLruGetBankLock(SlruCtl ctl, int64 pageno)
SlruSharedData * SlruShared
#define SlruPagePrecedesUnitTests(ctl, per_page)
bool(* SlruScanCallback)(SlruCtl ctl, char *filename, int64 segpage, void *data)
#define SLRU_MAX_ALLOWED_BUFFERS
@ SLRU_PAGE_WRITE_IN_PROGRESS
@ SLRU_PAGE_READ_IN_PROGRESS
PgStat_Counter slru_written
LWLockPadded * bank_locks
pg_atomic_uint64 latest_page_number
SlruPageStatus * page_status
LWLockPadded * buffer_locks
int fd[MAX_WRITEALL_BUFFERS]
int64 segno[MAX_WRITEALL_BUFFERS]
bool RegisterSyncRequest(const FileTag *ftag, SyncRequestType type, bool retryOnError)
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)
static bool TransactionIdFollowsOrEquals(TransactionId id1, TransactionId id2)
static bool TransactionIdPrecedes(TransactionId id1, TransactionId id2)
static void pgstat_report_wait_start(uint32 wait_event_info)
static void pgstat_report_wait_end(void)
CheckpointStatsData CheckpointStats
void XLogFlush(XLogRecPtr record)
#define XLogRecPtrIsValid(r)