// CheckAndRecover is the main entry point for the recovery mechanism func CheckAndRecover(specificInstance *inst.InstanceKey, candidateInstanceKey *inst.InstanceKey, skipFilters bool, skipProcesses bool) (actionTaken bool, instance *inst.Instance, err error) { replicationAnalysis, err := inst.GetReplicationAnalysis(true) if err != nil { return false, nil, log.Errore(err) } for _, analysisEntry := range replicationAnalysis { if specificInstance != nil { // We are looking for a specific instance; if this is not the one, skip! if !specificInstance.Equals(&analysisEntry.AnalyzedInstanceKey) { continue } } if analysisEntry.IsDowntimed && specificInstance == nil { // Only recover a downtimed server if explicitly requested continue } if specificInstance != nil && skipFilters { // force mode. Keep it synchronuous actionTaken, instance, err = executeCheckAndRecoverFunction(analysisEntry, candidateInstanceKey, skipFilters, skipProcesses) } else { go executeCheckAndRecoverFunction(analysisEntry, candidateInstanceKey, skipFilters, skipProcesses) } } return actionTaken, instance, err }
// CheckAndRecover is the main entry point for the recovery mechanism func CheckAndRecover(specificInstance *inst.InstanceKey, candidateInstanceKey *inst.InstanceKey, skipProcesses bool) (recoveryAttempted bool, promotedSlaveKey *inst.InstanceKey, err error) { replicationAnalysis, err := inst.GetReplicationAnalysis("", true, true) if err != nil { return false, nil, log.Errore(err) } if *config.RuntimeCLIFlags.Noop { log.Debugf("--noop provided; will not execute processes") skipProcesses = true } for _, analysisEntry := range replicationAnalysis { if specificInstance != nil { // We are looking for a specific instance; if this is not the one, skip! if !specificInstance.Equals(&analysisEntry.AnalyzedInstanceKey) { continue } } if analysisEntry.IsDowntimed && specificInstance == nil { // Only recover a downtimed server if explicitly requested continue } if specificInstance != nil { // force mode. Keep it synchronuous var topologyRecovery *TopologyRecovery recoveryAttempted, topologyRecovery, err = executeCheckAndRecoverFunction(analysisEntry, candidateInstanceKey, true, skipProcesses) if topologyRecovery != nil { promotedSlaveKey = topologyRecovery.SuccessorKey } } else { go executeCheckAndRecoverFunction(analysisEntry, candidateInstanceKey, false, skipProcesses) } } return recoveryAttempted, promotedSlaveKey, err }