From ecedbdf7b038b453903299a8cd8b2759e06aab56 Mon Sep 17 00:00:00 2001 From: Amul Sul Date: Wed, 16 Jun 2021 09:02:24 -0400 Subject: [PATCH v33 4/8] Refactor: add function to set database state in control file ==== TODO: ==== - The same code updating database state exists in StartupXLOG() but not sure do we need to optimize that since that code update SharedRecoveryState while holding ControlFileLock. --- src/backend/access/transam/xlog.c | 31 ++++++++++++++++--------------- src/include/access/xlog.h | 2 ++ 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 453eb2700b5..1ec236352d5 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -38,7 +38,6 @@ #include "access/xlogreader.h" #include "access/xlogutils.h" #include "catalog/catversion.h" -#include "catalog/pg_control.h" #include "catalog/pg_database.h" #include "commands/progress.h" #include "commands/tablespace.h" @@ -4979,6 +4978,19 @@ UpdateControlFile(void) update_controlfile(DataDir, ControlFile, true); } +/* + * Set ControlFile's database state + */ +void +SetControlFileDBState(DBState state) +{ + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + ControlFile->state = state; + ControlFile->time = (pg_time_t) time(NULL); + UpdateControlFile(); + LWLockRelease(ControlFileLock); +} + /* * Returns the unique system identifier from control file. */ @@ -9036,13 +9048,7 @@ CreateCheckPoint(int flags) START_CRIT_SECTION(); if (shutdown) - { - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - ControlFile->state = DB_SHUTDOWNING; - ControlFile->time = (pg_time_t) time(NULL); - UpdateControlFile(); - LWLockRelease(ControlFileLock); - } + SetControlFileDBState(DB_SHUTDOWNING); /* * Let smgr prepare for checkpoint; this has to happen before we determine @@ -9591,13 +9597,8 @@ CreateRestartPoint(int flags) UpdateMinRecoveryPoint(InvalidXLogRecPtr, true); if (flags & CHECKPOINT_IS_SHUTDOWN) - { - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY; - ControlFile->time = (pg_time_t) time(NULL); - UpdateControlFile(); - LWLockRelease(ControlFileLock); - } + SetControlFileDBState(DB_SHUTDOWNED_IN_RECOVERY); + return false; } diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index 0a8ede700de..4f8b3e31ab7 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -15,6 +15,7 @@ #include "access/xlogdefs.h" #include "access/xloginsert.h" #include "access/xlogreader.h" +#include "catalog/pg_control.h" #include "datatype/timestamp.h" #include "lib/stringinfo.h" #include "nodes/pg_list.h" @@ -300,6 +301,7 @@ extern void XLOGShmemInit(void); extern void BootStrapXLOG(void); extern void LocalProcessControlFile(bool reset); extern void StartupXLOG(void); +extern void SetControlFileDBState(DBState state); extern void ShutdownXLOG(int code, Datum arg); extern void InitXLOGAccess(void); extern void CreateCheckPoint(int flags); -- 2.18.0