From 99341ba250aae7186e3a974d2d5fa035ac0dc625 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Tue, 26 May 2020 19:26:45 +0000 Subject: [PATCH v1 1/1] Assert that ControlFileLock is held exclusively in UpdateControlFile(). --- src/backend/access/transam/xlog.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index ca09d81b08..f71f6a287b 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -4900,6 +4900,7 @@ ReadControlFile(void) void UpdateControlFile(void) { + Assert(LWLockHeldByMeInMode(ControlFileLock, LW_EXCLUSIVE)); update_controlfile(DataDir, ControlFile, true); } @@ -6955,8 +6956,14 @@ StartupXLOG(void) } } ControlFile->time = (pg_time_t) time(NULL); - /* No need to hold ControlFileLock yet, we aren't up far enough */ + + /* + * We aren't up far enough yet to need the ControlFileLock, but we take + * it anyway to satisfy the assertion in UpdateControlFile(). + */ + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); UpdateControlFile(); + LWLockRelease(ControlFileLock); /* * Initialize our local copy of minRecoveryPoint. When doing crash @@ -9743,6 +9750,8 @@ XLogReportParameters(void) XLogFlush(recptr); } + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + ControlFile->MaxConnections = MaxConnections; ControlFile->max_worker_processes = max_worker_processes; ControlFile->max_wal_senders = max_wal_senders; @@ -9752,6 +9761,8 @@ XLogReportParameters(void) ControlFile->wal_log_hints = wal_log_hints; ControlFile->track_commit_timestamp = track_commit_timestamp; UpdateControlFile(); + + LWLockRelease(ControlFileLock); } } -- 2.16.6