From 646b56044a55c927f5b527e7d23aa9ec74953161 Mon Sep 17 00:00:00 2001 From: Maxim Orlov Date: Fri, 11 Mar 2022 11:36:34 +0300 Subject: [PATCH v24 1/2] Use unsigned 64-bit numbering of SLRU pages. Having 64-bit numbering of SLRU pages is a requirement for using 64-bit XIDs. This is part of transition to 64bit XIDs. It does not affect XID length and format. Author: Alexander Korotkov Author: Teodor Sigaev Author: Nikita Glukhov Author: Maxim Orlov Author: Pavel Borisov Author: Yura Sokolov Author: Aleksander Alekseev Reviewed-by: Aleksander Alekseev Discussion: https://postgr.es/m/CACG%3DezZe1NQSCnfHOr78AtAZxJZeCvxrts0ygrxYwe%3DpyyjVWA%40mail.gmail.com Discussion: https://postgr.es/m/CAJ7c6TPDOYBYrnCAeyndkBktO0WG2xSdYduTF0nxq%2BvfkmTF5Q%40mail.gmail.com --- src/backend/access/transam/clog.c | 4 +- src/backend/access/transam/commit_ts.c | 4 +- src/backend/access/transam/multixact.c | 10 +- src/backend/access/transam/slru.c | 119 ++++++++++---------- src/backend/access/transam/subtrans.c | 4 +- src/backend/commands/async.c | 32 +++--- src/backend/storage/lmgr/predicate.c | 10 +- src/bin/pg_verifybackup/t/003_corruption.pl | 2 +- src/include/access/slru.h | 24 ++-- 9 files changed, 104 insertions(+), 105 deletions(-) diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c index 3d9088a7048..9ad71216ce3 100644 --- a/src/backend/access/transam/clog.c +++ b/src/backend/access/transam/clog.c @@ -90,7 +90,7 @@ static SlruCtlData XactCtlData; static int ZeroCLOGPage(int pageno, bool writeXlog); -static bool CLOGPagePrecedes(int page1, int page2); +static bool CLOGPagePrecedes(uint64 page1, uint64 page2); static void WriteZeroPageXlogRec(int pageno); static void WriteTruncateXlogRec(int pageno, TransactionId oldestXact, Oid oldestXactDb); @@ -932,7 +932,7 @@ TruncateCLOG(TransactionId oldestXact, Oid oldestxid_datoid) * don't optimize that edge case. */ static bool -CLOGPagePrecedes(int page1, int page2) +CLOGPagePrecedes(uint64 page1, uint64 page2) { TransactionId xid1; TransactionId xid2; diff --git a/src/backend/access/transam/commit_ts.c b/src/backend/access/transam/commit_ts.c index 20950eb1e4a..ae69d3fea1e 100644 --- a/src/backend/access/transam/commit_ts.c +++ b/src/backend/access/transam/commit_ts.c @@ -111,7 +111,7 @@ static void TransactionIdSetCommitTs(TransactionId xid, TimestampTz ts, RepOriginId nodeid, int slotno); static void error_commit_ts_disabled(void); static int ZeroCommitTsPage(int pageno, bool writeXlog); -static bool CommitTsPagePrecedes(int page1, int page2); +static bool CommitTsPagePrecedes(uint64 page1, uint64 page2); static void ActivateCommitTs(void); static void DeactivateCommitTs(void); static void WriteZeroPageXlogRec(int pageno); @@ -939,7 +939,7 @@ AdvanceOldestCommitTsXid(TransactionId oldestXact) * oldestXact=N+2.1, it would be precious at oldestXact=N+2.9. */ static bool -CommitTsPagePrecedes(int page1, int page2) +CommitTsPagePrecedes(uint64 page1, uint64 page2) { TransactionId xid1; TransactionId xid2; diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index 6a70d497380..fd9d3d3eef8 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -355,8 +355,8 @@ static char *mxstatus_to_string(MultiXactStatus status); /* management of SLRU infrastructure */ static int ZeroMultiXactOffsetPage(int pageno, bool writeXlog); static int ZeroMultiXactMemberPage(int pageno, bool writeXlog); -static bool MultiXactOffsetPagePrecedes(int page1, int page2); -static bool MultiXactMemberPagePrecedes(int page1, int page2); +static bool MultiXactOffsetPagePrecedes(uint64 page1, uint64 page2); +static bool MultiXactMemberPagePrecedes(uint64 page1, uint64 page2); static bool MultiXactOffsetPrecedes(MultiXactOffset offset1, MultiXactOffset offset2); static void ExtendMultiXactOffset(MultiXactId multi); @@ -2878,7 +2878,7 @@ typedef struct mxtruncinfo * This callback determines the earliest existing page number. */ static bool -SlruScanDirCbFindEarliest(SlruCtl ctl, char *filename, int segpage, void *data) +SlruScanDirCbFindEarliest(SlruCtl ctl, char *filename, uint64 segpage, void *data) { mxtruncinfo *trunc = (mxtruncinfo *) data; @@ -3129,7 +3129,7 @@ TruncateMultiXact(MultiXactId newOldestMulti, Oid newOldestMultiDB) * translational symmetry. */ static bool -MultiXactOffsetPagePrecedes(int page1, int page2) +MultiXactOffsetPagePrecedes(uint64 page1, uint64 page2) { MultiXactId multi1; MultiXactId multi2; @@ -3149,7 +3149,7 @@ MultiXactOffsetPagePrecedes(int page1, int page2) * purposes. There is no "invalid offset number" so use the numbers verbatim. */ static bool -MultiXactMemberPagePrecedes(int page1, int page2) +MultiXactMemberPagePrecedes(uint64 page1, uint64 page2) { MultiXactOffset offset1; MultiXactOffset offset2; diff --git a/src/backend/access/transam/slru.c b/src/backend/access/transam/slru.c index 30a476ed5dc..72733bc2d2f 100644 --- a/src/backend/access/transam/slru.c +++ b/src/backend/access/transam/slru.c @@ -59,9 +59,11 @@ #include "pgstat.h" #include "storage/fd.h" #include "storage/shmem.h" +#include "utils/builtins.h" #define SlruFileName(ctl, path, seg) \ - snprintf(path, MAXPGPATH, "%s/%04X", (ctl)->Dir, seg) + snprintf(path, MAXPGPATH, "%s/%04X%08X", (ctl)->Dir, \ + (uint32) ((seg) >> 32), (uint32) ((seg) & (uint64)0xFFFFFFFF)) /* * During SimpleLruWriteAll(), we will usually not need to write more than one @@ -75,7 +77,7 @@ typedef struct SlruWriteAllData { int num_files; /* # files actually open */ int fd[MAX_WRITEALL_BUFFERS]; /* their FD's */ - int segno[MAX_WRITEALL_BUFFERS]; /* their log seg#s */ + uint64 segno[MAX_WRITEALL_BUFFERS]; /* their log seg#s */ } SlruWriteAllData; typedef struct SlruWriteAllData *SlruWriteAll; @@ -138,20 +140,20 @@ static int slru_errno; static void SimpleLruZeroLSNs(SlruCtl ctl, int slotno); static void SimpleLruWaitIO(SlruCtl ctl, int slotno); static void SlruInternalWritePage(SlruCtl ctl, int slotno, SlruWriteAll fdata); -static bool SlruPhysicalReadPage(SlruCtl ctl, int pageno, int slotno); -static bool SlruPhysicalWritePage(SlruCtl ctl, int pageno, int slotno, +static bool SlruPhysicalReadPage(SlruCtl ctl, uint64 pageno, int slotno); +static bool SlruPhysicalWritePage(SlruCtl ctl, uint64 pageno, int slotno, SlruWriteAll fdata); -static void SlruReportIOError(SlruCtl ctl, int pageno, TransactionId xid); -static int SlruSelectLRUPage(SlruCtl ctl, int pageno); +static void SlruReportIOError(SlruCtl ctl, uint64 pageno, TransactionId xid); +static int SlruSelectLRUPage(SlruCtl ctl, uint64 pageno); static bool SlruScanDirCbDeleteCutoff(SlruCtl ctl, char *filename, - int segpage, void *data); -static void SlruInternalDeleteSegment(SlruCtl ctl, int segno); + uint64 segpage, void *data); +static void SlruInternalDeleteSegment(SlruCtl ctl, uint64 segno); + /* * Initialization of shared memory */ - Size SimpleLruShmemSize(int nslots, int nlsns) { @@ -162,7 +164,7 @@ SimpleLruShmemSize(int nslots, int nlsns) sz += MAXALIGN(nslots * sizeof(char *)); /* page_buffer[] */ sz += MAXALIGN(nslots * sizeof(SlruPageStatus)); /* page_status[] */ sz += MAXALIGN(nslots * sizeof(bool)); /* page_dirty[] */ - sz += MAXALIGN(nslots * sizeof(int)); /* page_number[] */ + sz += MAXALIGN(nslots * sizeof(uint64)); /* page_number[] */ sz += MAXALIGN(nslots * sizeof(int)); /* page_lru_count[] */ sz += MAXALIGN(nslots * sizeof(LWLockPadded)); /* buffer_locks[] */ @@ -225,8 +227,8 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, offset += MAXALIGN(nslots * sizeof(SlruPageStatus)); shared->page_dirty = (bool *) (ptr + offset); offset += MAXALIGN(nslots * sizeof(bool)); - shared->page_number = (int *) (ptr + offset); - offset += MAXALIGN(nslots * sizeof(int)); + shared->page_number = (uint64 *) (ptr + offset); + offset += MAXALIGN(nslots * sizeof(uint64)); shared->page_lru_count = (int *) (ptr + offset); offset += MAXALIGN(nslots * sizeof(int)); @@ -277,7 +279,7 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, * Control lock must be held at entry, and will be held at exit. */ int -SimpleLruZeroPage(SlruCtl ctl, int pageno) +SimpleLruZeroPage(SlruCtl ctl, uint64 pageno) { SlruShared shared = ctl->shared; int slotno; @@ -392,7 +394,7 @@ SimpleLruWaitIO(SlruCtl ctl, int slotno) * Control lock must be held at entry, and will be held at exit. */ int -SimpleLruReadPage(SlruCtl ctl, int pageno, bool write_ok, +SimpleLruReadPage(SlruCtl ctl, uint64 pageno, bool write_ok, TransactionId xid) { SlruShared shared = ctl->shared; @@ -492,7 +494,7 @@ SimpleLruReadPage(SlruCtl ctl, int pageno, bool write_ok, * It is unspecified whether the lock will be shared or exclusive. */ int -SimpleLruReadPage_ReadOnly(SlruCtl ctl, int pageno, TransactionId xid) +SimpleLruReadPage_ReadOnly(SlruCtl ctl, uint64 pageno, TransactionId xid) { SlruShared shared = ctl->shared; int slotno; @@ -539,7 +541,7 @@ static void SlruInternalWritePage(SlruCtl ctl, int slotno, SlruWriteAll fdata) { SlruShared shared = ctl->shared; - int pageno = shared->page_number[slotno]; + uint64 pageno = shared->page_number[slotno]; bool ok; /* If a write is in progress, wait for it to finish */ @@ -623,11 +625,11 @@ SimpleLruWritePage(SlruCtl ctl, int slotno) * large enough to contain the given page. */ bool -SimpleLruDoesPhysicalPageExist(SlruCtl ctl, int pageno) +SimpleLruDoesPhysicalPageExist(SlruCtl ctl, uint64 pageno) { - int segno = pageno / SLRU_PAGES_PER_SEGMENT; - int rpageno = pageno % SLRU_PAGES_PER_SEGMENT; - int offset = rpageno * BLCKSZ; + uint64 segno = pageno / SLRU_PAGES_PER_SEGMENT; + uint64 rpageno = pageno % SLRU_PAGES_PER_SEGMENT; + uint64 offset = rpageno * BLCKSZ; char path[MAXPGPATH]; int fd; bool result; @@ -681,11 +683,11 @@ SimpleLruDoesPhysicalPageExist(SlruCtl ctl, int pageno) * read/write operations. We could cache one virtual file pointer ... */ static bool -SlruPhysicalReadPage(SlruCtl ctl, int pageno, int slotno) +SlruPhysicalReadPage(SlruCtl ctl, uint64 pageno, int slotno) { SlruShared shared = ctl->shared; - int segno = pageno / SLRU_PAGES_PER_SEGMENT; - int rpageno = pageno % SLRU_PAGES_PER_SEGMENT; + uint64 segno = pageno / SLRU_PAGES_PER_SEGMENT; + uint64 rpageno = pageno % SLRU_PAGES_PER_SEGMENT; off_t offset = rpageno * BLCKSZ; char path[MAXPGPATH]; int fd; @@ -753,11 +755,11 @@ SlruPhysicalReadPage(SlruCtl ctl, int pageno, int slotno) * SimpleLruWriteAll. */ static bool -SlruPhysicalWritePage(SlruCtl ctl, int pageno, int slotno, SlruWriteAll fdata) +SlruPhysicalWritePage(SlruCtl ctl, uint64 pageno, int slotno, SlruWriteAll fdata) { SlruShared shared = ctl->shared; - int segno = pageno / SLRU_PAGES_PER_SEGMENT; - int rpageno = pageno % SLRU_PAGES_PER_SEGMENT; + uint64 segno = pageno / SLRU_PAGES_PER_SEGMENT; + uint64 rpageno = pageno % SLRU_PAGES_PER_SEGMENT; off_t offset = rpageno * BLCKSZ; char path[MAXPGPATH]; int fd = -1; @@ -928,11 +930,11 @@ SlruPhysicalWritePage(SlruCtl ctl, int pageno, int slotno, SlruWriteAll fdata) * SlruPhysicalWritePage. Call this after cleaning up shared-memory state. */ static void -SlruReportIOError(SlruCtl ctl, int pageno, TransactionId xid) +SlruReportIOError(SlruCtl ctl, uint64 pageno, TransactionId xid) { - int segno = pageno / SLRU_PAGES_PER_SEGMENT; - int rpageno = pageno % SLRU_PAGES_PER_SEGMENT; - int offset = rpageno * BLCKSZ; + uint64 segno = pageno / SLRU_PAGES_PER_SEGMENT; + uint64 rpageno = pageno % SLRU_PAGES_PER_SEGMENT; + uint64 offset = rpageno * BLCKSZ; char path[MAXPGPATH]; SlruFileName(ctl, path, segno); @@ -949,33 +951,34 @@ SlruReportIOError(SlruCtl ctl, int pageno, TransactionId xid) ereport(ERROR, (errcode_for_file_access(), errmsg("could not access status of transaction %u", xid), - errdetail("Could not seek in file \"%s\" to offset %u: %m.", - path, offset))); + errdetail("Could not seek in file \"%s\" to offset %llu: %m.", + path, (unsigned long long) offset))); break; case SLRU_READ_FAILED: if (errno) ereport(ERROR, (errcode_for_file_access(), errmsg("could not access status of transaction %u", xid), - errdetail("Could not read from file \"%s\" at offset %u: %m.", - path, offset))); + errdetail("Could not read from file \"%s\" at offset %llu: %m.", + path, (unsigned long long) offset))); else ereport(ERROR, (errmsg("could not access status of transaction %u", xid), - errdetail("Could not read from file \"%s\" at offset %u: read too few bytes.", path, offset))); + errdetail("Could not read from file \"%s\" at offset %llu: read too few bytes.", + path, (unsigned long long) offset))); break; case SLRU_WRITE_FAILED: if (errno) ereport(ERROR, (errcode_for_file_access(), errmsg("could not access status of transaction %u", xid), - errdetail("Could not write to file \"%s\" at offset %u: %m.", - path, offset))); + errdetail("Could not write to file \"%s\" at offset %llu: %m.", + path, (unsigned long long) offset))); else ereport(ERROR, (errmsg("could not access status of transaction %u", xid), - errdetail("Could not write to file \"%s\" at offset %u: wrote too few bytes.", - path, offset))); + errdetail("Could not write to file \"%s\" at offset %llu: wrote too few bytes.", + path, (unsigned long long) offset))); break; case SLRU_FSYNC_FAILED: ereport(data_sync_elevel(ERROR), @@ -1013,7 +1016,7 @@ SlruReportIOError(SlruCtl ctl, int pageno, TransactionId xid) * Control lock must be held at entry, and will be held at exit. */ static int -SlruSelectLRUPage(SlruCtl ctl, int pageno) +SlruSelectLRUPage(SlruCtl ctl, uint64 pageno) { SlruShared shared = ctl->shared; @@ -1024,10 +1027,10 @@ SlruSelectLRUPage(SlruCtl ctl, int pageno) int cur_count; int bestvalidslot = 0; /* keep compiler quiet */ int best_valid_delta = -1; - int best_valid_page_number = 0; /* keep compiler quiet */ + uint64 best_valid_page_number = 0; /* keep compiler quiet */ int bestinvalidslot = 0; /* keep compiler quiet */ int best_invalid_delta = -1; - int best_invalid_page_number = 0; /* keep compiler quiet */ + uint64 best_invalid_page_number = 0; /* keep compiler quiet */ /* See if page already has a buffer assigned */ for (slotno = 0; slotno < shared->num_slots; slotno++) @@ -1068,7 +1071,7 @@ SlruSelectLRUPage(SlruCtl ctl, int pageno) for (slotno = 0; slotno < shared->num_slots; slotno++) { int this_delta; - int this_page_number; + uint64 this_page_number; if (shared->page_status[slotno] == SLRU_PAGE_EMPTY) return slotno; @@ -1158,7 +1161,7 @@ SimpleLruWriteAll(SlruCtl ctl, bool allow_redirtied) SlruShared shared = ctl->shared; SlruWriteAllData fdata; int slotno; - int pageno = 0; + uint64 pageno = 0; int i; bool ok; @@ -1223,7 +1226,7 @@ SimpleLruWriteAll(SlruCtl ctl, bool allow_redirtied) * after it has accrued freshly-written data. */ void -SimpleLruTruncate(SlruCtl ctl, int cutoffPage) +SimpleLruTruncate(SlruCtl ctl, uint64 cutoffPage) { SlruShared shared = ctl->shared; int slotno; @@ -1301,7 +1304,7 @@ restart:; * they either can't yet contain anything, or have already been cleaned out. */ static void -SlruInternalDeleteSegment(SlruCtl ctl, int segno) +SlruInternalDeleteSegment(SlruCtl ctl, uint64 segno) { char path[MAXPGPATH]; @@ -1324,7 +1327,7 @@ SlruInternalDeleteSegment(SlruCtl ctl, int segno) * Delete an individual SLRU segment, identified by the segment number. */ void -SlruDeleteSegment(SlruCtl ctl, int segno) +SlruDeleteSegment(SlruCtl ctl, uint64 segno) { SlruShared shared = ctl->shared; int slotno; @@ -1497,9 +1500,10 @@ SlruPagePrecedesUnitTests(SlruCtl ctl, int per_page) * one containing the page passed as "data". */ bool -SlruScanDirCbReportPresence(SlruCtl ctl, char *filename, int segpage, void *data) +SlruScanDirCbReportPresence(SlruCtl ctl, char *filename, uint64 segpage, + void *data) { - int cutoffPage = *(int *) data; + uint64 cutoffPage = *(uint64 *) data; if (SlruMayDeleteSegment(ctl, segpage, cutoffPage)) return true; /* found one; don't iterate any more */ @@ -1512,9 +1516,10 @@ SlruScanDirCbReportPresence(SlruCtl ctl, char *filename, int segpage, void *data * This callback deletes segments prior to the one passed in as "data". */ static bool -SlruScanDirCbDeleteCutoff(SlruCtl ctl, char *filename, int segpage, void *data) +SlruScanDirCbDeleteCutoff(SlruCtl ctl, char *filename, uint64 segpage, + void *data) { - int cutoffPage = *(int *) data; + uint64 cutoffPage = *(uint64 *) data; if (SlruMayDeleteSegment(ctl, segpage, cutoffPage)) SlruInternalDeleteSegment(ctl, segpage / SLRU_PAGES_PER_SEGMENT); @@ -1527,7 +1532,7 @@ SlruScanDirCbDeleteCutoff(SlruCtl ctl, char *filename, int segpage, void *data) * This callback deletes all segments. */ bool -SlruScanDirCbDeleteAll(SlruCtl ctl, char *filename, int segpage, void *data) +SlruScanDirCbDeleteAll(SlruCtl ctl, char *filename, uint64 segpage, void *data) { SlruInternalDeleteSegment(ctl, segpage / SLRU_PAGES_PER_SEGMENT); @@ -1555,8 +1560,8 @@ SlruScanDirectory(SlruCtl ctl, SlruScanCallback callback, void *data) bool retval = false; DIR *cldir; struct dirent *clde; - int segno; - int segpage; + uint64 segno; + uint64 segpage; cldir = AllocateDir(ctl->Dir); while ((clde = ReadDir(cldir, ctl->Dir)) != NULL) @@ -1565,10 +1570,10 @@ SlruScanDirectory(SlruCtl ctl, SlruScanCallback callback, void *data) len = strlen(clde->d_name); - if ((len == 4 || len == 5 || len == 6) && + if ((len == 12 || len == 13 || len == 14) && strspn(clde->d_name, "0123456789ABCDEF") == len) { - segno = (int) strtol(clde->d_name, NULL, 16); + segno = strtou64(clde->d_name, NULL, 16); segpage = segno * SLRU_PAGES_PER_SEGMENT; elog(DEBUG2, "SlruScanDirectory invoking callback on %s/%s", @@ -1596,7 +1601,7 @@ SlruSyncFileTag(SlruCtl ctl, const FileTag *ftag, char *path) int save_errno; int result; - SlruFileName(ctl, path, ftag->segno); + SlruFileName(ctl, path, (uint64) ftag->segno); fd = OpenTransientFile(path, O_RDWR | PG_BINARY); if (fd < 0) diff --git a/src/backend/access/transam/subtrans.c b/src/backend/access/transam/subtrans.c index 66d35481552..659a9d7da88 100644 --- a/src/backend/access/transam/subtrans.c +++ b/src/backend/access/transam/subtrans.c @@ -64,7 +64,7 @@ static SlruCtlData SubTransCtlData; static int ZeroSUBTRANSPage(int pageno); -static bool SubTransPagePrecedes(int page1, int page2); +static bool SubTransPagePrecedes(uint64 page1, uint64 page2); /* @@ -359,7 +359,7 @@ TruncateSUBTRANS(TransactionId oldestXact) * Analogous to CLOGPagePrecedes(). */ static bool -SubTransPagePrecedes(int page1, int page2) +SubTransPagePrecedes(uint64 page1, uint64 page2) { TransactionId xid1; TransactionId xid2; diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c index 455d895a44a..4e283fa9355 100644 --- a/src/backend/commands/async.c +++ b/src/backend/commands/async.c @@ -186,8 +186,8 @@ typedef struct AsyncQueueEntry char data[NAMEDATALEN + NOTIFY_PAYLOAD_MAX_LENGTH]; } AsyncQueueEntry; -/* Currently, no field of AsyncQueueEntry requires more than int alignment */ -#define QUEUEALIGN(len) INTALIGN(len) +/* AsyncQueueEntry.xid requires 8-byte alignment */ +#define QUEUEALIGN(len) TYPEALIGN(8, len) #define AsyncQueueEntryEmptySize (offsetof(AsyncQueueEntry, data) + 2) @@ -196,7 +196,7 @@ typedef struct AsyncQueueEntry */ typedef struct QueuePosition { - int page; /* SLRU page number */ + uint64 page; /* SLRU page number */ int offset; /* byte offset within page */ } QueuePosition; @@ -443,8 +443,8 @@ static bool tryAdvanceTail = false; bool Trace_notify = false; /* local function prototypes */ -static int asyncQueuePageDiff(int p, int q); -static bool asyncQueuePagePrecedes(int p, int q); +static int64 asyncQueuePageDiff(uint64 p, uint64 q); +static bool asyncQueuePagePrecedes(uint64 p, uint64 q); static void queue_listen(ListenActionKind action, const char *channel); static void Async_UnlistenOnExit(int code, Datum arg); static void Exec_ListenPreCommit(void); @@ -477,17 +477,17 @@ static void ClearPendingActionsAndNotifies(void); * Compute the difference between two queue page numbers (i.e., p - q), * accounting for wraparound. */ -static int -asyncQueuePageDiff(int p, int q) +static int64 +asyncQueuePageDiff(uint64 p, uint64 q) { - int diff; + int64 diff; /* * We have to compare modulo (QUEUE_MAX_PAGE+1)/2. Both inputs should be * in the range 0..QUEUE_MAX_PAGE. */ - Assert(p >= 0 && p <= QUEUE_MAX_PAGE); - Assert(q >= 0 && q <= QUEUE_MAX_PAGE); + Assert(p <= QUEUE_MAX_PAGE); + Assert(q <= QUEUE_MAX_PAGE); diff = p - q; if (diff >= ((QUEUE_MAX_PAGE + 1) / 2)) @@ -497,14 +497,8 @@ asyncQueuePageDiff(int p, int q) return diff; } -/* - * Is p < q, accounting for wraparound? - * - * Since asyncQueueIsFull() blocks creation of a page that could precede any - * extant page, we need not assess entries within a page. - */ static bool -asyncQueuePagePrecedes(int p, int q) +asyncQueuePagePrecedes(uint64 p, uint64 q) { return asyncQueuePageDiff(p, q) < 0; } @@ -1337,7 +1331,7 @@ asyncQueueIsFull(void) static bool asyncQueueAdvance(volatile QueuePosition *position, int entryLength) { - int pageno = QUEUE_POS_PAGE(*position); + uint64 pageno = QUEUE_POS_PAGE(*position); int offset = QUEUE_POS_OFFSET(*position); bool pageJump = false; @@ -1410,7 +1404,7 @@ asyncQueueAddEntries(ListCell *nextNotify) { AsyncQueueEntry qe; QueuePosition queue_head; - int pageno; + uint64 pageno; int offset; int slotno; diff --git a/src/backend/storage/lmgr/predicate.c b/src/backend/storage/lmgr/predicate.c index e337aad5b24..ff9f08cde95 100644 --- a/src/backend/storage/lmgr/predicate.c +++ b/src/backend/storage/lmgr/predicate.c @@ -438,7 +438,7 @@ static void SetPossibleUnsafeConflict(SERIALIZABLEXACT *roXact, SERIALIZABLEXACT static void ReleaseRWConflict(RWConflict conflict); static void FlagSxactUnsafe(SERIALIZABLEXACT *sxact); -static bool SerialPagePrecedesLogically(int page1, int page2); +static bool SerialPagePrecedesLogically(uint64 page1, uint64 page2); static void SerialInit(void); static void SerialAdd(TransactionId xid, SerCommitSeqNo minConflictCommitSeqNo); static SerCommitSeqNo SerialGetMinConflictCommitSeqNo(TransactionId xid); @@ -788,7 +788,7 @@ FlagSxactUnsafe(SERIALIZABLEXACT *sxact) * Analogous to CLOGPagePrecedes(). */ static bool -SerialPagePrecedesLogically(int page1, int page2) +SerialPagePrecedesLogically(uint64 page1, uint64 page2) { TransactionId xid1; TransactionId xid2; @@ -808,7 +808,7 @@ SerialPagePrecedesLogicallyUnitTests(void) { int per_page = SERIAL_ENTRIESPERPAGE, offset = per_page / 2; - int newestPage, + uint64 newestPage, oldestPage, headPage, targetPage; @@ -906,9 +906,9 @@ static void SerialAdd(TransactionId xid, SerCommitSeqNo minConflictCommitSeqNo) { TransactionId tailXid; - int targetPage; + uint64 targetPage; int slotno; - int firstZeroPage; + uint64 firstZeroPage; bool isNewPage; Assert(TransactionIdIsValid(xid)); diff --git a/src/bin/pg_verifybackup/t/003_corruption.pl b/src/bin/pg_verifybackup/t/003_corruption.pl index 406c0c9877a..7805ad1be79 100644 --- a/src/bin/pg_verifybackup/t/003_corruption.pl +++ b/src/bin/pg_verifybackup/t/003_corruption.pl @@ -176,7 +176,7 @@ sub mutilate_extra_tablespace_file sub mutilate_missing_file { my ($backup_path) = @_; - my $pathname = "$backup_path/pg_xact/0000"; + my $pathname = "$backup_path/pg_xact/000000000000"; unlink($pathname) || die "$pathname: $!"; return; } diff --git a/src/include/access/slru.h b/src/include/access/slru.h index 130c41c8632..b7ff036523c 100644 --- a/src/include/access/slru.h +++ b/src/include/access/slru.h @@ -64,7 +64,7 @@ typedef struct SlruSharedData char **page_buffer; SlruPageStatus *page_status; bool *page_dirty; - int *page_number; + uint64 *page_number; int *page_lru_count; LWLockPadded *buffer_locks; @@ -95,7 +95,7 @@ typedef struct SlruSharedData * this is not critical data, since we use it only to avoid swapping out * the latest page. */ - int latest_page_number; + uint64 latest_page_number; /* SLRU's index for statistics purposes (might not be unique) */ int slru_stats_idx; @@ -127,7 +127,7 @@ typedef struct SlruCtlData * the behavior of this callback has no functional implications.) Use * SlruPagePrecedesUnitTests() in SLRUs meeting its criteria. */ - bool (*PagePrecedes) (int, int); + bool (*PagePrecedes) (uint64, uint64); /* * Dir is set during SimpleLruInit and does not change thereafter. Since @@ -143,10 +143,10 @@ extern Size SimpleLruShmemSize(int nslots, int nlsns); extern void SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, LWLock *ctllock, const char *subdir, int tranche_id, SyncRequestHandler sync_handler); -extern int SimpleLruZeroPage(SlruCtl ctl, int pageno); -extern int SimpleLruReadPage(SlruCtl ctl, int pageno, bool write_ok, +extern int SimpleLruZeroPage(SlruCtl ctl, uint64 pageno); +extern int SimpleLruReadPage(SlruCtl ctl, uint64 pageno, bool write_ok, TransactionId xid); -extern int SimpleLruReadPage_ReadOnly(SlruCtl ctl, int pageno, +extern int SimpleLruReadPage_ReadOnly(SlruCtl ctl, uint64 pageno, TransactionId xid); extern void SimpleLruWritePage(SlruCtl ctl, int slotno); extern void SimpleLruWriteAll(SlruCtl ctl, bool allow_redirtied); @@ -155,20 +155,20 @@ extern void SlruPagePrecedesUnitTests(SlruCtl ctl, int per_page); #else #define SlruPagePrecedesUnitTests(ctl, per_page) do {} while (0) #endif -extern void SimpleLruTruncate(SlruCtl ctl, int cutoffPage); -extern bool SimpleLruDoesPhysicalPageExist(SlruCtl ctl, int pageno); +extern void SimpleLruTruncate(SlruCtl ctl, uint64 cutoffPage); +extern bool SimpleLruDoesPhysicalPageExist(SlruCtl ctl, uint64 pageno); -typedef bool (*SlruScanCallback) (SlruCtl ctl, char *filename, int segpage, +typedef bool (*SlruScanCallback) (SlruCtl ctl, char *filename, uint64 segpage, void *data); extern bool SlruScanDirectory(SlruCtl ctl, SlruScanCallback callback, void *data); -extern void SlruDeleteSegment(SlruCtl ctl, int segno); +extern void SlruDeleteSegment(SlruCtl ctl, uint64 segno); extern int SlruSyncFileTag(SlruCtl ctl, const FileTag *ftag, char *path); /* SlruScanDirectory public callbacks */ extern bool SlruScanDirCbReportPresence(SlruCtl ctl, char *filename, - int segpage, void *data); -extern bool SlruScanDirCbDeleteAll(SlruCtl ctl, char *filename, int segpage, + uint64 segpage, void *data); +extern bool SlruScanDirCbDeleteAll(SlruCtl ctl, char *filename, uint64 segpage, void *data); #endif /* SLRU_H */ -- 2.35.1