0003-Use-pg_pwrite-in-walreceiver.c.patch
application/octet-stream
Filename: 0003-Use-pg_pwrite-in-walreceiver.c.patch
Type: application/octet-stream
Part: 2
Patch
Format: format-patch
Series: patch 0003
Subject: Use pg_pwrite() in walreceiver.c.
| File | + | − |
|---|---|---|
| src/backend/replication/walreceiver.c | 3 | 25 |
From da6d712eeef2e3257d7fa672d95f2901bbe62887 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Fri, 7 Feb 2020 12:05:12 +1300
Subject: [PATCH 3/3] Use pg_pwrite() in walreceiver.c.
This gets rid of an lseek() call. While there was code to avoid
it in most cases, it's better to lose the call AND the global state
and code required to avoid it.
---
src/backend/replication/walreceiver.c | 28 +++------------------------
1 file changed, 3 insertions(+), 25 deletions(-)
diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c
index a5e85d32f3..2ab15c3cbb 100644
--- a/src/backend/replication/walreceiver.c
+++ b/src/backend/replication/walreceiver.c
@@ -85,14 +85,13 @@ WalReceiverFunctionsType *WalReceiverFunctions = NULL;
#define NAPTIME_PER_CYCLE 100 /* max sleep time between cycles (100ms) */
/*
- * These variables are used similarly to openLogFile/SegNo/Off,
+ * These variables are used similarly to openLogFile/SegNo,
* but for walreceiver to write the XLOG. recvFileTLI is the TimeLineID
* corresponding the filename of recvFile.
*/
static int recvFile = -1;
static TimeLineID recvFileTLI = 0;
static XLogSegNo recvSegNo = 0;
-static uint32 recvOff = 0;
/*
* Flags set by interrupt handlers of walreceiver for later service in the
@@ -945,7 +944,6 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr)
use_existent = true;
recvFile = XLogFileInit(recvSegNo, &use_existent, true);
recvFileTLI = ThisTimeLineID;
- recvOff = 0;
}
/* Calculate the start offset of the received logs */
@@ -956,29 +954,10 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr)
else
segbytes = nbytes;
- /* Need to seek in the file? */
- if (recvOff != startoff)
- {
- if (lseek(recvFile, (off_t) startoff, SEEK_SET) < 0)
- {
- char xlogfname[MAXFNAMELEN];
- int save_errno = errno;
-
- XLogFileName(xlogfname, recvFileTLI, recvSegNo, wal_segment_size);
- errno = save_errno;
- ereport(PANIC,
- (errcode_for_file_access(),
- errmsg("could not seek in log segment %s to offset %u: %m",
- xlogfname, startoff)));
- }
-
- recvOff = startoff;
- }
-
/* OK to write the logs */
errno = 0;
- byteswritten = write(recvFile, buf, segbytes);
+ byteswritten = pg_pwrite(recvFile, buf, segbytes, (off_t) startoff);
if (byteswritten <= 0)
{
char xlogfname[MAXFNAMELEN];
@@ -995,13 +974,12 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr)
(errcode_for_file_access(),
errmsg("could not write to log segment %s "
"at offset %u, length %lu: %m",
- xlogfname, recvOff, (unsigned long) segbytes)));
+ xlogfname, startoff, (unsigned long) segbytes)));
}
/* Update state for write */
recptr += byteswritten;
- recvOff += byteswritten;
nbytes -= byteswritten;
buf += byteswritten;
--
2.23.0