0001-WIP-Syncrep-and-improving-latency-due-to-WAL-throttl.patch
application/octet-stream
Filename: 0001-WIP-Syncrep-and-improving-latency-due-to-WAL-throttl.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0001
Subject: WIP: Syncrep and improving latency due to WAL throttling
| File | + | − |
|---|---|---|
| src/backend/access/transam/xact.c | 2 | 0 |
| src/backend/access/transam/xlog.c | 42 | 0 |
| src/backend/tcop/postgres.c | 3 | 0 |
| src/backend/utils/init/globals.c | 1 | 0 |
| src/include/access/xlog.h | 2 | 0 |
| src/include/miscadmin.h | 1 | 0 |
From 0923c1196bd8e4611de0a613a752e197d6c19a0f Mon Sep 17 00:00:00 2001
From: Jakub Wartak <jakub.wartak@enterprisedb.com>
Date: Thu, 26 Jan 2023 11:50:10 +0000
Subject: [PATCH] WIP: Syncrep and improving latency due to WAL throttling
---
src/backend/access/transam/xact.c | 2 ++
src/backend/access/transam/xlog.c | 42 +++++++++++++++++++++++++++++++
src/backend/tcop/postgres.c | 3 +++
src/backend/utils/init/globals.c | 1 +
src/include/access/xlog.h | 2 ++
src/include/miscadmin.h | 1 +
6 files changed, 51 insertions(+)
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index d85e313908..05d56d65f9 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -2395,6 +2395,7 @@ CommitTransaction(void)
XactTopFullTransactionId = InvalidFullTransactionId;
nParallelCurrentXids = 0;
+ backendWalInserted = 0;
/*
* done with commit processing, set current transaction state back to
@@ -2685,6 +2686,7 @@ PrepareTransaction(void)
XactTopFullTransactionId = InvalidFullTransactionId;
nParallelCurrentXids = 0;
+ backendWalInserted = 0;
/*
* done with 1st phase commit processing, set current transaction state
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index fb4c860bde..0add515b91 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -1,4 +1,5 @@
/*-------------------------------------------------------------------------
+
*
* xlog.c
* PostgreSQL write-ahead log manager
@@ -638,6 +639,8 @@ static bool holdingAllLocks = false;
static MemoryContext walDebugCxt = NULL;
#endif
+uint32 backendWalInserted = 0;
+
static void CleanupAfterArchiveRecovery(TimeLineID EndOfLogTLI,
XLogRecPtr EndOfLog,
TimeLineID newTLI);
@@ -1022,6 +1025,16 @@ XLogInsertRecord(XLogRecData *rdata,
pgWalUsage.wal_bytes += rechdr->xl_tot_len;
pgWalUsage.wal_records++;
pgWalUsage.wal_fpi += num_fpi;
+
+ /* WAL throttling */
+ backendWalInserted += rechdr->xl_tot_len;
+ if ((synchronous_commit == SYNCHRONOUS_COMMIT_REMOTE_APPLY || synchronous_commit == SYNCHRONOUS_COMMIT_REMOTE_WRITE) &&
+ /*synchronous_commit_flush_wal_after > 0 &&*/
+ backendWalInserted > 256L * 1024L)
+ {
+ InterruptPending=true;
+ XLogDelayPending=true;
+ }
}
return EndPos;
@@ -8952,3 +8965,32 @@ SetWalWriterSleeping(bool sleeping)
XLogCtl->WalWriterSleeping = sleeping;
SpinLockRelease(&XLogCtl->info_lck);
}
+
+
+/*
+ * Called from ProcessMessageInterrupts() to avoid waiting while being in critical section
+ */
+void HandleXLogDelayPending()
+{
+ /* flush only up to the last fully filled page */
+ XLogRecPtr LastFullyWrittenXLogPage = XactLastRecEnd - (XactLastRecEnd % XLOG_BLCKSZ);
+ XLogDelayPending = false;
+
+ //HOLD_INTERRUPTS();
+
+ /* XXX Debug for now */
+ elog(WARNING, "throttling WAL down on this session (backendWalInserted=%d, LSN=%X/%X flushingTo=%X/%X)",
+ backendWalInserted,
+ LSN_FORMAT_ARGS(XactLastRecEnd),
+ LSN_FORMAT_ARGS(LastFullyWrittenXLogPage));
+
+ /* XXX: refactor SyncRepWaitForLSN() to have different waitevent than default WAIT_EVENT_SYNC_REP */
+ /* maybe new WAIT_EVENT_SYNC_REP_BIG or something like that */
+ XLogFlush(LastFullyWrittenXLogPage);
+ SyncRepWaitForLSN(LastFullyWrittenXLogPage, false);
+ elog(WARNING, "throttling WAL down on this session - end");
+ backendWalInserted = 0;
+
+ //RESUME_INTERRUPTS();
+}
+
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 470b734e9e..9eaf2df1ce 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -3393,6 +3393,9 @@ ProcessInterrupts(void)
if (ParallelApplyMessagePending)
HandleParallelApplyMessages();
+
+ if (XLogDelayPending)
+ HandleXLogDelayPending();
}
/*
diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c
index 1b1d814254..8ed66b2eae 100644
--- a/src/backend/utils/init/globals.c
+++ b/src/backend/utils/init/globals.c
@@ -37,6 +37,7 @@ volatile sig_atomic_t IdleSessionTimeoutPending = false;
volatile sig_atomic_t ProcSignalBarrierPending = false;
volatile sig_atomic_t LogMemoryContextPending = false;
volatile sig_atomic_t IdleStatsUpdateTimeoutPending = false;
+volatile sig_atomic_t XLogDelayPending = false;
volatile uint32 InterruptHoldoffCount = 0;
volatile uint32 QueryCancelHoldoffCount = 0;
volatile uint32 CritSectionCount = 0;
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h
index cfe5409738..1c0d35ea91 100644
--- a/src/include/access/xlog.h
+++ b/src/include/access/xlog.h
@@ -51,6 +51,7 @@ extern PGDLLIMPORT char *wal_consistency_checking_string;
extern PGDLLIMPORT bool log_checkpoints;
extern PGDLLIMPORT bool track_wal_io_timing;
extern PGDLLIMPORT int wal_decode_buffer_size;
+extern PGDLLIMPORT uint32 backendWalInserted;
extern PGDLLIMPORT int CheckPointSegments;
@@ -246,6 +247,7 @@ extern TimeLineID GetWALInsertionTimeLine(void);
extern XLogRecPtr GetLastImportantRecPtr(void);
extern void SetWalWriterSleeping(bool sleeping);
+extern void HandleXLogDelayPending(void);
/*
* Routines used by xlogrecovery.c to call back into xlog.c during recovery.
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
index 96b3a1e1a0..0fbb600d65 100644
--- a/src/include/miscadmin.h
+++ b/src/include/miscadmin.h
@@ -95,6 +95,7 @@ extern PGDLLIMPORT volatile sig_atomic_t IdleSessionTimeoutPending;
extern PGDLLIMPORT volatile sig_atomic_t ProcSignalBarrierPending;
extern PGDLLIMPORT volatile sig_atomic_t LogMemoryContextPending;
extern PGDLLIMPORT volatile sig_atomic_t IdleStatsUpdateTimeoutPending;
+extern PGDLLIMPORT volatile sig_atomic_t XLogDelayPending;
extern PGDLLIMPORT volatile sig_atomic_t CheckClientConnectionPending;
extern PGDLLIMPORT volatile sig_atomic_t ClientConnectionLost;
--
2.30.2