($INBOX_DIR/description missing)
help / color / mirror / Atom feedFrom: Takashi Menjo <[email protected]>
Subject: [PATCH 03/13] Add wal_pmem_map to GUC
Date: Thu, 11 Mar 2021 17:55:53 +0900
---
src/backend/access/transam/xlog.c | 51 ++++++++++++++++++++++++-------
src/backend/utils/misc/guc.c | 14 +++++++++
src/include/access/xlog.h | 1 +
3 files changed, 55 insertions(+), 11 deletions(-)
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 87cd05c9454..02f63c31387 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -115,6 +115,7 @@ int CommitSiblings = 5; /* # concurrent xacts needed to sleep */
int wal_retrieve_retry_interval = 5000;
int max_slot_wal_keep_size_mb = -1;
bool track_wal_io_timing = false;
+bool wal_pmem_map = false;
#ifdef WAL_DEBUG
bool XLOG_DEBUG = false;
@@ -5194,13 +5195,28 @@ XLOGShmemSize(void)
{
Size size;
+ /*
+ * If we use WAL segment files as WAL buffers, we don't use the given
+ * value of wal_buffers. Instead, we set it to the value based on the
+ * segment size and the page size. This should be done before calculating
+ * the size of xlblocks array.
+ */
+ if (wal_pmem_map)
+ {
+ int npages;
+ char buf[32];
+
+ npages = wal_segment_size / XLOG_BLCKSZ;
+ snprintf(buf, sizeof(buf), "%d", (int) npages);
+ SetConfigOption("wal_buffers", buf, PGC_POSTMASTER, PGC_S_OVERRIDE);
+ }
/*
* If the value of wal_buffers is -1, use the preferred auto-tune value.
* This isn't an amazingly clean place to do this, but we must wait till
* NBuffers has received its final value, and must do it before using the
* value of XLOGbuffers to do anything important.
*/
- if (XLOGbuffers == -1)
+ else if (XLOGbuffers == -1)
{
char buf[32];
@@ -5216,10 +5232,17 @@ XLOGShmemSize(void)
size = add_size(size, mul_size(sizeof(WALInsertLockPadded), NUM_XLOGINSERT_LOCKS + 1));
/* xlblocks array */
size = add_size(size, mul_size(sizeof(XLogRecPtr), XLOGbuffers));
- /* extra alignment padding for XLOG I/O buffers */
- size = add_size(size, XLOG_BLCKSZ);
- /* and the buffers themselves */
- size = add_size(size, mul_size(XLOG_BLCKSZ, XLOGbuffers));
+
+ /*
+ * If we use WAL segment files as WAL buffers, we don't need volatile ones.
+ */
+ if (!wal_pmem_map)
+ {
+ /* extra alignment padding for XLOG I/O buffers */
+ size = add_size(size, XLOG_BLCKSZ);
+ /* and the buffers themselves */
+ size = add_size(size, mul_size(XLOG_BLCKSZ, XLOGbuffers));
+ }
/*
* Note: we don't count ControlFileData, it comes out of the "slop factor"
@@ -5313,13 +5336,19 @@ XLOGShmemInit(void)
}
/*
- * Align the start of the page buffers to a full xlog block size boundary.
- * This simplifies some calculations in XLOG insertion. It is also
- * required for O_DIRECT.
+ * If we use WAL segment files as WAL buffers, we don't need volatile ones.
*/
- allocptr = (char *) TYPEALIGN(XLOG_BLCKSZ, allocptr);
- XLogCtl->pages = allocptr;
- memset(XLogCtl->pages, 0, (Size) XLOG_BLCKSZ * XLOGbuffers);
+ if (!wal_pmem_map)
+ {
+ /*
+ * Align the start of the page buffers to a full xlog block size boundary.
+ * This simplifies some calculations in XLOG insertion. It is also
+ * required for O_DIRECT.
+ */
+ allocptr = (char *) TYPEALIGN(XLOG_BLCKSZ, allocptr);
+ XLogCtl->pages = allocptr;
+ memset(XLogCtl->pages, 0, (Size) XLOG_BLCKSZ * XLOGbuffers);
+ }
/*
* Do basic initialization of XLogCtl shared data. (StartupXLOG will fill
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index f9504d3aec4..ee18a9cf338 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -1344,6 +1344,20 @@ static struct config_bool ConfigureNamesBool[] =
NULL, NULL, NULL
},
+#ifdef USE_LIBPMEM
+ {
+ {"wal_pmem_map", PGC_POSTMASTER, WAL_SETTINGS,
+ gettext_noop("Map WAL segment files on PMEM as WAL buffers."),
+ gettext_noop("If true, postgres will memory-map WAL segment files "
+ "on PMEM to use them as WAL buffers instead of the "
+ "traditional volatile ones."),
+ },
+ &wal_pmem_map,
+ false,
+ NULL, NULL, NULL
+ },
+#endif
+
{
{"log_checkpoints", PGC_SIGHUP, LOGGING_WHAT,
gettext_noop("Logs each checkpoint."),
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h
index 34f6c89f067..73900cbc9e7 100644
--- a/src/include/access/xlog.h
+++ b/src/include/access/xlog.h
@@ -88,6 +88,7 @@ extern char *PrimaryConnInfo;
extern char *PrimarySlotName;
extern bool wal_receiver_create_temp_slot;
extern bool track_wal_io_timing;
+extern bool wal_pmem_map;
/* indirectly set via GUC system */
extern TransactionId recoveryTargetXid;
--
2.17.1
--k4f25fnPtRuIRUb3
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="0004-Export-InstallXLogFileSegment.patch"
view thread (10+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected]
Subject: Re: [PATCH 03/13] Add wal_pmem_map to GUC
In-Reply-To: <no-message-id-1861210@localhost>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox