Skip to content

Commit c53c6b9

Browse files
committed
Remove XLogFileInit() ability to skip ControlFileLock.
Cold paths, initdb and end-of-recovery, used it. Don't optimize them. Discussion: https://postgr.es/m/20210202151416.GB3304930@rfd.leadboat.com
1 parent 7ac10f6 commit c53c6b9

File tree

3 files changed

+16
-34
lines changed

3 files changed

+16
-34
lines changed

src/backend/access/transam/xlog.c

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -913,8 +913,7 @@ static void AdvanceXLInsertBuffer(XLogRecPtr upto, bool opportunistic);
913913
static bool XLogCheckpointNeeded(XLogSegNo new_segno);
914914
static void XLogWrite(XLogwrtRqst WriteRqst, bool flexible);
915915
static bool InstallXLogFileSegment(XLogSegNo *segno, char *tmppath,
916-
bool find_free, XLogSegNo max_segno,
917-
bool use_lock);
916+
bool find_free, XLogSegNo max_segno);
918917
static int XLogFileRead(XLogSegNo segno, int emode, TimeLineID tli,
919918
XLogSource source, bool notfoundOk);
920919
static int XLogFileReadAnyTLI(XLogSegNo segno, int emode, XLogSource source);
@@ -2492,7 +2491,7 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible)
24922491

24932492
/* create/use new log file */
24942493
use_existent = true;
2495-
openLogFile = XLogFileInit(openLogSegNo, &use_existent, true);
2494+
openLogFile = XLogFileInit(openLogSegNo, &use_existent);
24962495
ReserveExternalFD();
24972496
}
24982497

@@ -3265,10 +3264,6 @@ XLogNeedsFlush(XLogRecPtr record)
32653264
* pre-existing file will be deleted). On return, true if a pre-existing
32663265
* file was used.
32673266
*
3268-
* use_lock: if true, acquire ControlFileLock while moving file into
3269-
* place. This should be true except during bootstrap log creation. The
3270-
* caller must *not* hold the lock at call.
3271-
*
32723267
* Returns FD of opened file.
32733268
*
32743269
* Note: errors here are ERROR not PANIC because we might or might not be
@@ -3277,7 +3272,7 @@ XLogNeedsFlush(XLogRecPtr record)
32773272
* in a critical section.
32783273
*/
32793274
int
3280-
XLogFileInit(XLogSegNo logsegno, bool *use_existent, bool use_lock)
3275+
XLogFileInit(XLogSegNo logsegno, bool *use_existent)
32813276
{
32823277
char path[MAXPGPATH];
32833278
char tmppath[MAXPGPATH];
@@ -3437,8 +3432,7 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent, bool use_lock)
34373432
*/
34383433
max_segno = logsegno + CheckPointSegments;
34393434
if (!InstallXLogFileSegment(&installed_segno, tmppath,
3440-
*use_existent, max_segno,
3441-
use_lock))
3435+
*use_existent, max_segno))
34423436
{
34433437
/*
34443438
* No need for any more future segments, or InstallXLogFileSegment()
@@ -3592,7 +3586,7 @@ XLogFileCopy(XLogSegNo destsegno, TimeLineID srcTLI, XLogSegNo srcsegno,
35923586
/*
35933587
* Now move the segment into place with its final name.
35943588
*/
3595-
if (!InstallXLogFileSegment(&destsegno, tmppath, false, 0, false))
3589+
if (!InstallXLogFileSegment(&destsegno, tmppath, false, 0))
35963590
elog(ERROR, "InstallXLogFileSegment should not have failed");
35973591
}
35983592

@@ -3616,29 +3610,20 @@ XLogFileCopy(XLogSegNo destsegno, TimeLineID srcTLI, XLogSegNo srcsegno,
36163610
* free slot is found between *segno and max_segno. (Ignored when find_free
36173611
* is false.)
36183612
*
3619-
* use_lock: if true, acquire ControlFileLock while moving file into
3620-
* place. This should be true except during bootstrap log creation. The
3621-
* caller must *not* hold the lock at call.
3622-
*
36233613
* Returns true if the file was installed successfully. false indicates that
36243614
* max_segno limit was exceeded, or an error occurred while renaming the
36253615
* file into place.
36263616
*/
36273617
static bool
36283618
InstallXLogFileSegment(XLogSegNo *segno, char *tmppath,
3629-
bool find_free, XLogSegNo max_segno,
3630-
bool use_lock)
3619+
bool find_free, XLogSegNo max_segno)
36313620
{
36323621
char path[MAXPGPATH];
36333622
struct stat stat_buf;
36343623

36353624
XLogFilePath(path, ThisTimeLineID, *segno, wal_segment_size);
36363625

3637-
/*
3638-
* We want to be sure that only one process does this at a time.
3639-
*/
3640-
if (use_lock)
3641-
LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
3626+
LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
36423627

36433628
if (!find_free)
36443629
{
@@ -3653,8 +3638,7 @@ InstallXLogFileSegment(XLogSegNo *segno, char *tmppath,
36533638
if ((*segno) >= max_segno)
36543639
{
36553640
/* Failed to find a free slot within specified range */
3656-
if (use_lock)
3657-
LWLockRelease(ControlFileLock);
3641+
LWLockRelease(ControlFileLock);
36583642
return false;
36593643
}
36603644
(*segno)++;
@@ -3668,14 +3652,12 @@ InstallXLogFileSegment(XLogSegNo *segno, char *tmppath,
36683652
*/
36693653
if (durable_rename_excl(tmppath, path, LOG) != 0)
36703654
{
3671-
if (use_lock)
3672-
LWLockRelease(ControlFileLock);
3655+
LWLockRelease(ControlFileLock);
36733656
/* durable_rename_excl already emitted log message */
36743657
return false;
36753658
}
36763659

3677-
if (use_lock)
3678-
LWLockRelease(ControlFileLock);
3660+
LWLockRelease(ControlFileLock);
36793661

36803662
return true;
36813663
}
@@ -3946,7 +3928,7 @@ PreallocXlogFiles(XLogRecPtr endptr)
39463928
{
39473929
_logSegNo++;
39483930
use_existent = true;
3949-
lf = XLogFileInit(_logSegNo, &use_existent, true);
3931+
lf = XLogFileInit(_logSegNo, &use_existent);
39503932
close(lf);
39513933
if (!use_existent)
39523934
CheckpointStats.ckpt_segs_added++;
@@ -4223,7 +4205,7 @@ RemoveXlogFile(const char *segname, XLogSegNo recycleSegNo,
42234205
*endlogSegNo <= recycleSegNo &&
42244206
lstat(path, &statbuf) == 0 && S_ISREG(statbuf.st_mode) &&
42254207
InstallXLogFileSegment(endlogSegNo, path,
4226-
true, recycleSegNo, true))
4208+
true, recycleSegNo))
42274209
{
42284210
ereport(DEBUG2,
42294211
(errmsg_internal("recycled write-ahead log file \"%s\"",
@@ -5341,7 +5323,7 @@ BootStrapXLOG(void)
53415323

53425324
/* Create first XLOG segment file */
53435325
use_existent = false;
5344-
openLogFile = XLogFileInit(1, &use_existent, false);
5326+
openLogFile = XLogFileInit(1, &use_existent);
53455327

53465328
/*
53475329
* We needn't bother with Reserve/ReleaseExternalFD here, since we'll
@@ -5650,7 +5632,7 @@ exitArchiveRecovery(TimeLineID endTLI, XLogRecPtr endOfLog)
56505632
bool use_existent = true;
56515633
int fd;
56525634

5653-
fd = XLogFileInit(startLogSegNo, &use_existent, true);
5635+
fd = XLogFileInit(startLogSegNo, &use_existent);
56545636

56555637
if (close(fd) != 0)
56565638
{

src/backend/replication/walreceiver.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -924,7 +924,7 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr)
924924
/* Create/use new log file */
925925
XLByteToSeg(recptr, recvSegNo, wal_segment_size);
926926
use_existent = true;
927-
recvFile = XLogFileInit(recvSegNo, &use_existent, true);
927+
recvFile = XLogFileInit(recvSegNo, &use_existent);
928928
recvFileTLI = ThisTimeLineID;
929929
}
930930

src/include/access/xlog.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ extern XLogRecPtr XLogInsertRecord(struct XLogRecData *rdata,
296296
extern void XLogFlush(XLogRecPtr RecPtr);
297297
extern bool XLogBackgroundFlush(void);
298298
extern bool XLogNeedsFlush(XLogRecPtr RecPtr);
299-
extern int XLogFileInit(XLogSegNo segno, bool *use_existent, bool use_lock);
299+
extern int XLogFileInit(XLogSegNo segno, bool *use_existent);
300300
extern int XLogFileOpen(XLogSegNo segno);
301301

302302
extern void CheckXLogRemoved(XLogSegNo segno, TimeLineID tli);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy