Fix StopMaintenanceDaemon by introduction of dbData.daemonShuttingDown flag

pull/7286/head
ivyazmitinov 2024-06-18 17:20:41 +02:00
parent bcd1bb3805
commit 9f63b5a379
1 changed files with 13 additions and 15 deletions

View File

@ -90,6 +90,7 @@ typedef struct MaintenanceDaemonDBData
Oid userOid; Oid userOid;
pid_t workerPid; pid_t workerPid;
bool daemonStarted; bool daemonStarted;
bool daemonShuttingDown;
bool triggerNodeMetadataSync; bool triggerNodeMetadataSync;
Latch *latch; /* pointer to the background worker's latch */ Latch *latch; /* pointer to the background worker's latch */
} MaintenanceDaemonDBData; } MaintenanceDaemonDBData;
@ -243,6 +244,14 @@ InitializeMaintenanceDaemonBackend(void)
return; return;
} }
if (dbData->daemonShuttingDown)
{
elog(DEBUG1, "Another maintenance daemon for database %u is shutting down. "
"Aborting current initialization", MyDatabaseId);
LWLockRelease(&MaintenanceDaemonControl->lock);
return;
}
if (IsMaintenanceDaemon) if (IsMaintenanceDaemon)
{ {
/* /*
@ -1058,20 +1067,8 @@ MaintenanceDaemonShmemExit(int code, Datum arg)
MaintenanceDaemonDBData *myDbData = (MaintenanceDaemonDBData *) MaintenanceDaemonDBData *myDbData = (MaintenanceDaemonDBData *)
hash_search(MaintenanceDaemonDBHash, &databaseOid, hash_search(MaintenanceDaemonDBHash, &databaseOid,
HASH_FIND, NULL); HASH_REMOVE, NULL);
/* myDbData is NULL after StopMaintenanceDaemon */
if (myDbData != NULL)
{
/*
* Confirm that I am still the registered maintenance daemon before exiting.
*/
Assert(myDbData->workerPid == MyProcPid); Assert(myDbData->workerPid == MyProcPid);
myDbData->daemonStarted = false;
myDbData->workerPid = 0;
}
LWLockRelease(&MaintenanceDaemonControl->lock); LWLockRelease(&MaintenanceDaemonControl->lock);
} }
@ -1170,11 +1167,12 @@ StopMaintenanceDaemon(Oid databaseId)
MaintenanceDaemonDBData *dbData = (MaintenanceDaemonDBData *) hash_search( MaintenanceDaemonDBData *dbData = (MaintenanceDaemonDBData *) hash_search(
MaintenanceDaemonDBHash, MaintenanceDaemonDBHash,
&databaseId, &databaseId,
HASH_REMOVE, &found); HASH_FIND, &found);
if (found) if (found)
{ {
workerPid = dbData->workerPid; workerPid = dbData->workerPid;
dbData->daemonShuttingDown = true;
} }
LWLockRelease(&MaintenanceDaemonControl->lock); LWLockRelease(&MaintenanceDaemonControl->lock);