diff options
author | Alexander Korotkov <akorotkov@postgresql.org> | 2023-11-29 01:39:55 +0200 |
---|---|---|
committer | Alexander Korotkov <akorotkov@postgresql.org> | 2023-11-29 01:40:56 +0200 |
commit | 4ed8f0913bfdb5f3551de3c27fc2c2e880abc5a2 (patch) | |
tree | baa2a0501fa0e31380f68af5ddce0d15f76186a5 /src/backend/access/transam/subtrans.c | |
parent | a916b47e23290ca24ffd083e5128d994f62966f6 (diff) |
Index SLRUs by 64-bit integers rather than by 32-bit integers
We've had repeated bugs in the area of handling SLRU wraparound in the past,
some of which have caused data loss. Switching to an indexing system for SLRUs
that does not wrap around should allow us to get rid of a whole bunch
of problems and improve the overall reliability of the system.
This particular patch however only changes the indexing and doesn't address
the wraparound per se. This is going to be done in the following patches.
Author: Maxim Orlov, Aleksander Alekseev, Alexander Korotkov, Teodor Sigaev
Author: Nikita Glukhov, Pavel Borisov, Yura Sokolov
Reviewed-by: Jacob Champion, Heikki Linnakangas, Alexander Korotkov
Reviewed-by: Japin Li, Pavel Borisov, Tom Lane, Peter Eisentraut, Andres Freund
Reviewed-by: Andrey Borodin, Dilip Kumar, Aleksander Alekseev
Discussion: https://postgr.es/m/CACG%3DezZe1NQSCnfHOr78AtAZxJZeCvxrts0ygrxYwe%3DpyyjVWA%40mail.gmail.com
Discussion: https://postgr.es/m/CAJ7c6TPDOYBYrnCAeyndkBktO0WG2xSdYduTF0nxq%2BvfkmTF5Q%40mail.gmail.com
Diffstat (limited to 'src/backend/access/transam/subtrans.c')
-rw-r--r-- | src/backend/access/transam/subtrans.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/src/backend/access/transam/subtrans.c b/src/backend/access/transam/subtrans.c index 62bb610167c..64673eaef6b 100644 --- a/src/backend/access/transam/subtrans.c +++ b/src/backend/access/transam/subtrans.c @@ -51,7 +51,16 @@ /* We need four bytes per xact */ #define SUBTRANS_XACTS_PER_PAGE (BLCKSZ / sizeof(TransactionId)) -#define TransactionIdToPage(xid) ((xid) / (TransactionId) SUBTRANS_XACTS_PER_PAGE) +/* + * Although we return an int64 the actual value can't currently exceed + * 0xFFFFFFFF/SUBTRANS_XACTS_PER_PAGE. + */ +static inline int64 +TransactionIdToPage(TransactionId xid) +{ + return xid / (int64) SUBTRANS_XACTS_PER_PAGE; +} + #define TransactionIdToEntry(xid) ((xid) % (TransactionId) SUBTRANS_XACTS_PER_PAGE) @@ -63,8 +72,8 @@ static SlruCtlData SubTransCtlData; #define SubTransCtl (&SubTransCtlData) -static int ZeroSUBTRANSPage(int pageno); -static bool SubTransPagePrecedes(int page1, int page2); +static int ZeroSUBTRANSPage(int64 pageno); +static bool SubTransPagePrecedes(int64 page1, int64 page2); /* @@ -73,7 +82,7 @@ static bool SubTransPagePrecedes(int page1, int page2); void SubTransSetParent(TransactionId xid, TransactionId parent) { - int pageno = TransactionIdToPage(xid); + int64 pageno = TransactionIdToPage(xid); int entryno = TransactionIdToEntry(xid); int slotno; TransactionId *ptr; @@ -108,7 +117,7 @@ SubTransSetParent(TransactionId xid, TransactionId parent) TransactionId SubTransGetParent(TransactionId xid) { - int pageno = TransactionIdToPage(xid); + int64 pageno = TransactionIdToPage(xid); int entryno = TransactionIdToEntry(xid); int slotno; TransactionId *ptr; @@ -193,7 +202,8 @@ SUBTRANSShmemInit(void) SubTransCtl->PagePrecedes = SubTransPagePrecedes; SimpleLruInit(SubTransCtl, "Subtrans", NUM_SUBTRANS_BUFFERS, 0, SubtransSLRULock, "pg_subtrans", - LWTRANCHE_SUBTRANS_BUFFER, SYNC_HANDLER_NONE); + LWTRANCHE_SUBTRANS_BUFFER, SYNC_HANDLER_NONE, + false); SlruPagePrecedesUnitTests(SubTransCtl, SUBTRANS_XACTS_PER_PAGE); } @@ -233,7 +243,7 @@ BootStrapSUBTRANS(void) * Control lock must be held at entry, and will be held at exit. */ static int -ZeroSUBTRANSPage(int pageno) +ZeroSUBTRANSPage(int64 pageno) { return SimpleLruZeroPage(SubTransCtl, pageno); } @@ -249,8 +259,8 @@ void StartupSUBTRANS(TransactionId oldestActiveXID) { FullTransactionId nextXid; - int startPage; - int endPage; + int64 startPage; + int64 endPage; /* * Since we don't expect pg_subtrans to be valid across crashes, we @@ -307,7 +317,7 @@ CheckPointSUBTRANS(void) void ExtendSUBTRANS(TransactionId newestXact) { - int pageno; + int64 pageno; /* * No work except at first XID of a page. But beware: just after @@ -337,7 +347,7 @@ ExtendSUBTRANS(TransactionId newestXact) void TruncateSUBTRANS(TransactionId oldestXact) { - int cutoffPage; + int64 cutoffPage; /* * The cutoff point is the start of the segment containing oldestXact. We @@ -359,7 +369,7 @@ TruncateSUBTRANS(TransactionId oldestXact) * Analogous to CLOGPagePrecedes(). */ static bool -SubTransPagePrecedes(int page1, int page2) +SubTransPagePrecedes(int64 page1, int64 page2) { TransactionId xid1; TransactionId xid2; |