/* * Set flag indicating that master needs to shut down */ void FtsRequestMasterShutdown() { #ifdef USE_ASSERT_CHECKING Assert(!*ftsShutdownMaster); PrimaryMirrorMode pm_mode; getPrimaryMirrorStatusCodes(&pm_mode, NULL, NULL, NULL); Assert(pm_mode == PMModeMaster); #endif /*USE_ASSERT_CHECKING*/ *ftsShutdownMaster = true; }
/* * FileRepSubProcess_ProcessSignals() * */ bool FileRepSubProcess_ProcessSignals() { bool processExit = false; if (reloadConfigFile) { reloadConfigFile = false; ProcessConfigFile(PGC_SIGHUP); FileRep_SetFileRepRetry(); } if (shutdownRequested) { SegmentState_e segmentState; getPrimaryMirrorStatusCodes(NULL, &segmentState, NULL, NULL); shutdownRequested = false; if (segmentState == SegmentStateShutdownFilerepBackends) { processExit = FileRepIsBackendSubProcess(fileRepProcessType); FileRepSubProcess_SetState(FileRepStateShutdownBackends); } else { processExit = true; FileRepSubProcess_SetState(FileRepStateShutdown); } } /* * Immediate shutdown if postmaster or main filerep process (parent) is * not alive to avoid manual cleanup. */ if (!PostmasterIsAlive(false /* amDirectChild */ ) || !ParentProcIsAlive()) { quickdie_impl(); } for (;;) { /* check to see if change required */ sig_atomic_t curStateChangeRequestCounter = stateChangeRequestCounter; if (curStateChangeRequestCounter == lastChangeRequestProcessCounterValue) break; lastChangeRequestProcessCounterValue = curStateChangeRequestCounter; /* do the change in local memory */ getFileRepRoleAndState(&fileRepRole, &segmentState, &dataState, NULL, NULL); switch (segmentState) { case SegmentStateNotInitialized: FileRepSubProcess_SetState(FileRepStateNotInitialized); break; case SegmentStateInitialization: FileRepSubProcess_SetState(FileRepStateInitialization); break; case SegmentStateInResyncTransition: FileRepSubProcess_SetState(FileRepStateInitialization); break; case SegmentStateInChangeTrackingTransition: case SegmentStateInSyncTransition: /* fileRepState remains Ready */ break; case SegmentStateChangeTrackingDisabled: case SegmentStateReady: FileRepSubProcess_SetState(FileRepStateReady); break; case SegmentStateFault: FileRepSubProcess_SetState(FileRepStateFault); break; case SegmentStateShutdownFilerepBackends: if (fileRepRole == FileRepPrimaryRole) { FileRepSubProcess_SetState(FileRepStateShutdownBackends); } else { processExit = true; FileRepSubProcess_SetState(FileRepStateShutdown); } break; case SegmentStateImmediateShutdown: case SegmentStateShutdown: processExit = true; FileRepSubProcess_SetState(FileRepStateShutdown); break; default: Assert(0); break; } //switch () if (processExit == true) { FileRep_IpcSignalAll(); } } return (processExit); }
static void PersistentFilespace_GetPaths(FilespaceDirEntry filespaceDirEntry, char **primaryFilespaceLocation, char **mirrorFilespaceLocation) { int16 primaryDbId; char *primaryBlankPadded = NULL; char *mirrorBlankPadded = NULL; /* * The persistent_filespace_node_table contains the paths for both the * primary and mirror nodes, and the table is the same on both sides of the * mirror. When it was first created the primary put its location first, * but we don't know if we were the primary when it was created or not. To * determine which path corresponds to this node we compare our dbid to the * one stored in the table. */ primaryDbId = GpIdentity.dbid; if (filespaceDirEntry->dbId1 == primaryDbId) { /* dbid == dbid1 */ primaryBlankPadded = filespaceDirEntry->locationBlankPadded1; mirrorBlankPadded = filespaceDirEntry->locationBlankPadded2; } else if (filespaceDirEntry->dbId2 == primaryDbId) { /* dbid == dbid2 */ primaryBlankPadded = filespaceDirEntry->locationBlankPadded2; mirrorBlankPadded = filespaceDirEntry->locationBlankPadded1; } else { /* * The dbid check above does not work for the Master Node during * initial startup, because the master doesn't yet know its own dbid. * To handle this we special case for the master node the master * always considers the first entry as the correct location. * * Note: This design may need to be reconsidered to handle standby * masters! */ PrimaryMirrorMode mode; getPrimaryMirrorStatusCodes(&mode, NULL, NULL, NULL); if (mode == PMModeMaster) { /* Master node */ primaryBlankPadded = filespaceDirEntry->locationBlankPadded1; mirrorBlankPadded = filespaceDirEntry->locationBlankPadded2; } else { /* * Current dbid matches neither dbid in table and was not started * as a master node. */ ereport(FATAL, (errcode(ERRCODE_INTERNAL_ERROR), errmsg("Unable to determine dbid for filespace lookup"))); } } /* These should both have been populated by one of the cases above */ Assert(primaryBlankPadded); Assert(mirrorBlankPadded); PersistentFilespace_ConvertBlankPaddedLocation( primaryFilespaceLocation, primaryBlankPadded, /* isPrimary */ true); PersistentFilespace_ConvertBlankPaddedLocation( mirrorFilespaceLocation, mirrorBlankPadded, /* isPrimary */ false); }
bool PersistentFilespace_TryGetPrimaryAndMirrorUnderLock( Oid filespaceOid, /* The filespace OID to lookup. */ char **primaryFilespaceLocation, /* The primary filespace directory path. Return NULL for global and base. */ char **mirrorFilespaceLocation) /* The primary filespace directory path. Return NULL for global and base. * Or, returns NULL when mirror not configured. */ { FilespaceDirEntry filespaceDirEntry; int16 primaryDbId; char *primaryBlankPadded = NULL; char *mirrorBlankPadded = NULL; *primaryFilespaceLocation = NULL; *mirrorFilespaceLocation = NULL; #ifdef MASTER_MIRROR_SYNC /* * Can't rely on persistent tables or memory structures on the standby so * get it from the cache maintained by the master mirror sync code */ if (IsStandbyMode()) { return mmxlog_filespace_get_path( filespaceOid, primaryFilespaceLocation); } #endif /* * Important to make this call AFTER we check if we are the Standby Master. */ PersistentFilespace_VerifyInitScan(); filespaceDirEntry = PersistentFilespace_FindDirUnderLock( filespaceOid); if (filespaceDirEntry == NULL) return false; /* * The persistent_filespace_node_table contains the paths for both the * primary and mirror nodes, and the table is the same on both sides of the * mirror. When it was first created the primary put its location first, * but we don't know if we were the primary when it was created or not. To * determine which path corresponds to this node we compare our dbid to the * one stored in the table. */ primaryDbId = GpIdentity.dbid; if (filespaceDirEntry->dbId1 == primaryDbId) { /* dbid == dbid1 */ primaryBlankPadded = filespaceDirEntry->locationBlankPadded1; mirrorBlankPadded = filespaceDirEntry->locationBlankPadded2; } else if (filespaceDirEntry->dbId2 == primaryDbId) { /* dbid == dbid2 */ primaryBlankPadded = filespaceDirEntry->locationBlankPadded2; mirrorBlankPadded = filespaceDirEntry->locationBlankPadded1; } else { /* * The dbid check above does not work for the Master Node during * initial startup, because the master doesn't yet know its own dbid. * To handle this we special case for the master node the master * always considers the first entry as the correct location. * * Note: This design may need to be reconsidered to handle standby * masters! */ PrimaryMirrorMode mode; getPrimaryMirrorStatusCodes(&mode, NULL, NULL, NULL); if (mode == PMModeMaster) { /* Master node */ primaryBlankPadded = filespaceDirEntry->locationBlankPadded1; mirrorBlankPadded = filespaceDirEntry->locationBlankPadded2; } else { /* * Current dbid matches neither dbid in table and was not started * as a master node. */ ereport(FATAL, (errcode(ERRCODE_INTERNAL_ERROR), errmsg("Unable to determine dbid for filespace lookup"))); } } /* These should both have been populated by one of the cases above */ Assert(primaryBlankPadded); Assert(mirrorBlankPadded); PersistentFilespace_ConvertBlankPaddedLocation( primaryFilespaceLocation, primaryBlankPadded, /* isPrimary */ true); PersistentFilespace_ConvertBlankPaddedLocation( mirrorFilespaceLocation, mirrorBlankPadded, /* isPrimary */ false); return true; }