From 2ec11d17adb6f19216a50998728d6a39c38f53a9 Mon Sep 17 00:00:00 2001 From: Antonin Houska Date: Fri, 5 Jul 2019 16:24:01 +0200 Subject: [PATCH 07/17] Refactoring patch. This only moves some code to XLogWritePages() function because it needs to be used in a little bit different way for encrypted XLOG. Done in a separate diff so that the following diff is a bit easier to read. --- src/backend/access/transam/xlog.c | 67 ++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 6b58e0ac76..cce7eca641 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -875,6 +875,7 @@ static void LocalSetXLogInsertAllowed(void); static void CreateEndOfRecoveryRecord(void); static void CheckPointGuts(XLogRecPtr checkPointRedo, int flags); static void KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo); +static Size XLogWritePages(char *from, int npages, uint32 startoffset); static XLogRecPtr XLogGetReplicationSlotMinimumLSN(void); static void AdvanceXLInsertBuffer(XLogRecPtr upto, bool opportunistic); @@ -2485,35 +2486,10 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible) finishing_seg) { char *from; - Size nbytes; - Size nleft; - int written; /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; - nbytes = npages * (Size) XLOG_BLCKSZ; - nleft = nbytes; - do - { - errno = 0; - pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); - written = pg_pwrite(openLogFile, from, nleft, startoffset); - pgstat_report_wait_end(); - if (written <= 0) - { - if (errno == EINTR) - continue; - ereport(PANIC, - (errcode_for_file_access(), - errmsg("could not write to log file %s " - "at offset %u, length %zu: %m", - XLogFileNameP(ThisTimeLineID, openLogSegNo), - startoffset, nleft))); - } - nleft -= written; - from += written; - startoffset += written; - } while (nleft > 0); + startoffset += XLogWritePages(from, npages, startoffset); npages = 0; @@ -2630,6 +2606,45 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible) } /* + * Write page(s) to the XLOG file. + * + * Returns the number of bytes written. + */ +static Size +XLogWritePages(char *from, int npages, uint32 startoffset) +{ + Size nbytes, + nleft; + Size written; + + nbytes = npages * (Size) XLOG_BLCKSZ; + nleft = nbytes; + do + { + errno = 0; + pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); + written = pg_pwrite(openLogFile, from, nleft, startoffset); + pgstat_report_wait_end(); + if (written <= 0) + { + if (errno == EINTR) + continue; + ereport(PANIC, + (errcode_for_file_access(), + errmsg("could not write to log file %s " + "at offset %u, length %zu: %m", + XLogFileNameP(ThisTimeLineID, openLogSegNo), + startoffset, nbytes))); + } + nleft -= written; + from += written; + startoffset += written; + } while (nleft > 0); + + return written; +} + +/* * Record the LSN for an asynchronous transaction commit/abort * and nudge the WALWriter if there is work for it to do. * (This should not be called for synchronous commits.) -- 2.13.7