96 if (
ctl->options.long_segment_names)
116 (
unsigned int) segno);
126#define MAX_WRITEALL_BUFFERS 16
145#define SLRU_BANK_BITSHIFT 4
146#define SLRU_BANK_SIZE (1 << SLRU_BANK_BITSHIFT)
151#define SlotGetBankNumber(slotno) ((slotno) >> SLRU_BANK_BITSHIFT)
159#define INIT_SLRUFILETAG(a,xx_handler,xx_segno) \
161 memset(&(a), 0, sizeof(FileTag)), \
162 (a).handler = (xx_handler), \
163 (a).segno = (xx_segno) \
307 ptr = (
char *) shared;
310 offset +=
MAXALIGN(nslots *
sizeof(
char *));
314 offset +=
MAXALIGN(nslots *
sizeof(
bool));
318 offset +=
MAXALIGN(nslots *
sizeof(
int));
326 offset +=
MAXALIGN(nbanks *
sizeof(
int));
746 for (
int i = 0;
i <
fdata->num_files;
i++)
882 (
errmsg(
"file \"%s\" doesn't exist, reading as zeroes",
983 for (
int i = 0;
i <
fdata->num_files;
i++)
1111 errmsg(
"could not open file \"%s\": %m", path),
1117 errmsg(
"could not seek in file \"%s\" to offset %d: %m",
1125 errmsg(
"could not read from file \"%s\" at offset %d: %m",
1130 (
errmsg(
"could not read from file \"%s\" at offset %d: read too few bytes",
1138 errmsg(
"Could not write to file \"%s\" at offset %d: %m",
1143 (
errmsg(
"Could not write to file \"%s\" at offset %d: wrote too few bytes.",
1150 errmsg(
"could not fsync file \"%s\": %m",
1157 errmsg(
"could not close file \"%s\": %m",
1163 elog(
ERROR,
"unrecognized SimpleLru error cause: %d",
1386 fdata.num_files = 0;
1428 for (
int i = 0;
i <
fdata.num_files;
i++)
1484 (
errmsg(
"could not truncate directory \"%s\": apparent wraparound",
1485 ctl->options.Dir)));
1663#ifdef USE_ASSERT_CHECKING
1716 oldestXact -= 1U << 31;
1732 oldestXact -= 1U << 31;
1813 if (
ctl->options.long_segment_names)
1825 return (
len == 4 ||
len == 5 ||
len == 6);
1846 bool retval =
false;
1865 elog(
DEBUG2,
"SlruScanDirectory invoking callback on %s/%s",
1866 ctl->options.Dir,
clde->d_name);
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)
memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets))
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)
int LWLockNewTrancheId(const char *name)
bool LWLockHeldByMeInMode(LWLock *lock, LWLockMode mode)
void LWLockRelease(LWLock *lock)
void LWLockInitialize(LWLock *lock, int tranche_id)
bool LWLockConditionalAcquire(LWLock *lock, LWLockMode mode)
void * MemoryContextAlloc(MemoryContext context, Size size)
MemoryContext TopMemoryContext
#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)
static int fd(const char *x, int i)
void ShmemRequestInternal(ShmemStructOpts *options, ShmemRequestKind kind)
static void SimpleLruZeroLSNs(SlruDesc *ctl, int slotno)
bool SlruScanDirectory(SlruDesc *ctl, SlruScanCallback callback, void *data)
static bool SlruMayDeleteSegment(SlruDesc *ctl, int64 segpage, int64 cutoffPage)
#define INIT_SLRUFILETAG(a, xx_handler, xx_segno)
int SimpleLruReadPage_ReadOnly(SlruDesc *ctl, int64 pageno, const void *opaque_data)
static int SlruSelectLRUPage(SlruDesc *ctl, int64 pageno)
static void SlruReportIOError(SlruDesc *ctl, int64 pageno, const void *opaque_data)
int SimpleLruAutotuneBuffers(int divisor, int max)
bool SlruScanDirCbReportPresence(SlruDesc *ctl, char *filename, int64 segpage, void *data)
static SlruErrorCause slru_errcause
static bool SlruScanDirCbDeleteCutoff(SlruDesc *ctl, char *filename, int64 segpage, void *data)
static int SlruFileName(SlruDesc *ctl, char *path, int64 segno)
#define MAX_WRITEALL_BUFFERS
static bool SlruCorrectSegmentFilenameLength(SlruDesc *ctl, size_t len)
static void SlruInternalDeleteSegment(SlruDesc *ctl, int64 segno)
static bool SlruPhysicalWritePage(SlruDesc *ctl, int64 pageno, int slotno, SlruWriteAll fdata)
void shmem_slru_init(void *location, ShmemStructOpts *base_options)
void SimpleLruTruncate(SlruDesc *ctl, int64 cutoffPage)
static bool SlruPhysicalReadPage(SlruDesc *ctl, int64 pageno, int slotno)
void SimpleLruZeroAndWritePage(SlruDesc *ctl, int64 pageno)
static void SimpleLruWaitIO(SlruDesc *ctl, int slotno)
static void SlruInternalWritePage(SlruDesc *ctl, int slotno, SlruWriteAll fdata)
void SlruDeleteSegment(SlruDesc *ctl, int64 segno)
int SimpleLruZeroPage(SlruDesc *ctl, int64 pageno)
#define SlotGetBankNumber(slotno)
void shmem_slru_attach(void *location, ShmemStructOpts *base_options)
bool SimpleLruDoesPhysicalPageExist(SlruDesc *ctl, int64 pageno)
static Size SimpleLruShmemSize(int nslots, int nlsns)
struct SlruWriteAllData * SlruWriteAll
bool SlruScanDirCbDeleteAll(SlruDesc *ctl, char *filename, int64 segpage, void *data)
void SimpleLruWritePage(SlruDesc *ctl, int slotno)
void SimpleLruWriteAll(SlruDesc *ctl, bool allow_redirtied)
int SimpleLruReadPage(SlruDesc *ctl, int64 pageno, bool write_ok, const void *opaque_data)
static void SlruRecentlyUsed(SlruShared shared, int slotno)
void SimpleLruRequestWithOpts(const SlruOpts *options)
bool check_slru_buffers(const char *name, int *newval)
int SlruSyncFileTag(SlruDesc *ctl, const FileTag *ftag, char *path)
SlruSharedData * SlruShared
#define SlruPagePrecedesUnitTests(ctl, per_page)
bool(* SlruScanCallback)(SlruDesc *ctl, char *filename, int64 segpage, void *data)
#define SLRU_MAX_ALLOWED_BUFFERS
static LWLock * SimpleLruGetBankLock(SlruDesc *ctl, int64 pageno)
@ 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)