From da6d712eeef2e3257d7fa672d95f2901bbe62887 Mon Sep 17 00:00:00 2001 From: Thomas Munro 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