diff --git a/src/backend/postmaster/startup.c b/src/backend/postmaster/startup.c index 22135d5e07..69077bd207 100644 --- a/src/backend/postmaster/startup.c +++ b/src/backend/postmaster/startup.c @@ -62,6 +62,9 @@ static volatile sig_atomic_t in_restore_command = false; static void StartupProcTriggerHandler(SIGNAL_ARGS); static void StartupProcSigHupHandler(SIGNAL_ARGS); +/* Callbacks */ +static void StartupProcExit(int code, Datum arg); + /* -------------------------------- * signal handler routines @@ -183,6 +186,19 @@ HandleStartupProcInterrupts(void) } +/* -------------------------------- + * signal handler routines + * -------------------------------- + */ +static void +StartupProcExit(int code, Datum arg) +{ + /* Shutdown the recovery environment */ + if (standbyState != STANDBY_DISABLED) + ShutdownRecoveryTransactionEnvironment(); +} + + /* ---------------------------------- * Startup Process main entry point * ---------------------------------- @@ -190,6 +206,9 @@ HandleStartupProcInterrupts(void) void StartupProcessMain(void) { + /* Arrange to clean up at startup process exit */ + on_shmem_exit(StartupProcExit, 0); + /* * Properly accept or ignore signals the postmaster might send us. */ diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c index 17de5a6d0e..aae6d28f93 100644 --- a/src/backend/storage/ipc/standby.c +++ b/src/backend/storage/ipc/standby.c @@ -131,6 +131,12 @@ InitRecoveryTransactionEnvironment(void) void ShutdownRecoveryTransactionEnvironment(void) { + static bool called = false; + + /* Prevent transaction tracking from being shut down more than once */ + if (called) + return; + /* Mark all tracked in-progress transactions as finished. */ ExpireAllKnownAssignedTransactionIds(); @@ -143,6 +149,8 @@ ShutdownRecoveryTransactionEnvironment(void) /* Cleanup our VirtualTransaction */ VirtualXactLockTableCleanup(); + + called = true; }