// readRecoveries reads recovery entry/audit entires from topology_recovery func readFailureDetections(whereCondition string, limit string) ([]TopologyRecovery, error) { res := []TopologyRecovery{} query := fmt.Sprintf(` select detection_id, hostname, port, in_active_period as is_active, start_active_period, end_active_period_unixtime, processing_node_hostname, processcing_node_token, analysis, cluster_name, cluster_alias, count_affected_slaves, slave_hosts from topology_failure_detection %s order by detection_id desc %s `, whereCondition, limit) db, err := db.OpenOrchestrator() if err != nil { goto Cleanup } err = sqlutils.QueryRowsMap(db, query, func(m sqlutils.RowMap) error { failureDetection := TopologyRecovery{} failureDetection.Id = m.GetInt64("detection_id") failureDetection.IsActive = m.GetBool("is_active") failureDetection.RecoveryStartTimestamp = m.GetString("start_active_period") failureDetection.ProcessingNodeHostname = m.GetString("processing_node_hostname") failureDetection.ProcessingNodeToken = m.GetString("processcing_node_token") failureDetection.AnalysisEntry.AnalyzedInstanceKey.Hostname = m.GetString("hostname") failureDetection.AnalysisEntry.AnalyzedInstanceKey.Port = m.GetInt("port") failureDetection.AnalysisEntry.Analysis = inst.AnalysisCode(m.GetString("analysis")) failureDetection.AnalysisEntry.ClusterDetails.ClusterName = m.GetString("cluster_name") failureDetection.AnalysisEntry.ClusterDetails.ClusterAlias = m.GetString("cluster_alias") failureDetection.AnalysisEntry.CountSlaves = m.GetUint("count_affected_slaves") failureDetection.AnalysisEntry.ReadSlaveHostsFromString(m.GetString("slave_hosts")) failureDetection.AnalysisEntry.ClusterDetails.ReadRecoveryInfo() res = append(res, failureDetection) return nil }) Cleanup: if err != nil { log.Errore(err) } return res, err }
// ReadBlockedRecoveries reads blocked recovery entries, potentially filtered by cluster name (empty to unfilter) func ReadBlockedRecoveries(clusterName string) ([]BlockedTopologyRecovery, error) { res := []BlockedTopologyRecovery{} whereClause := "" args := sqlutils.Args() if clusterName != "" { whereClause = `where cluster_name = ?` args = append(args, clusterName) } query := fmt.Sprintf(` select hostname, port, cluster_name, analysis, last_blocked_timestamp, blocking_recovery_id from blocked_topology_recovery %s order by last_blocked_timestamp desc `, whereClause) err := db.QueryOrchestrator(query, args, func(m sqlutils.RowMap) error { blockedTopologyRecovery := BlockedTopologyRecovery{} blockedTopologyRecovery.FailedInstanceKey.Hostname = m.GetString("hostname") blockedTopologyRecovery.FailedInstanceKey.Port = m.GetInt("port") blockedTopologyRecovery.ClusterName = m.GetString("cluster_name") blockedTopologyRecovery.Analysis = inst.AnalysisCode(m.GetString("analysis")) blockedTopologyRecovery.LastBlockedTimestamp = m.GetString("last_blocked_timestamp") blockedTopologyRecovery.BlockingRecoveryId = m.GetInt64("blocking_recovery_id") res = append(res, blockedTopologyRecovery) return nil }) if err != nil { log.Errore(err) } return res, err }
// readRecoveries reads recovery entry/audit entires from topology_recovery func readRecoveries(whereCondition string, limit string) ([]TopologyRecovery, error) { res := []TopologyRecovery{} query := fmt.Sprintf(` select recovery_id, hostname, port, (IFNULL(end_active_period_unixtime, 0) = 0) as is_active, start_active_period, IFNULL(end_active_period_unixtime, 0) as end_active_period_unixtime, IFNULL(end_recovery, '') AS end_recovery, is_successful, processing_node_hostname, processcing_node_token, ifnull(successor_hostname, '') as successor_hostname, ifnull(successor_port, 0) as successor_port, analysis, cluster_name, cluster_alias, count_affected_slaves, slave_hosts, participating_instances, lost_slaves, all_errors, acknowledged, acknowledged_at, acknowledged_by, acknowledge_comment from topology_recovery %s order by recovery_id desc %s `, whereCondition, limit) err := db.QueryOrchestratorRowsMap(query, func(m sqlutils.RowMap) error { topologyRecovery := *NewTopologyRecovery(inst.ReplicationAnalysis{}) topologyRecovery.Id = m.GetInt64("recovery_id") topologyRecovery.IsActive = m.GetBool("is_active") topologyRecovery.RecoveryStartTimestamp = m.GetString("start_active_period") topologyRecovery.RecoveryEndTimestamp = m.GetString("end_recovery") topologyRecovery.IsSuccessful = m.GetBool("is_successful") topologyRecovery.ProcessingNodeHostname = m.GetString("processing_node_hostname") topologyRecovery.ProcessingNodeToken = m.GetString("processcing_node_token") topologyRecovery.AnalysisEntry.AnalyzedInstanceKey.Hostname = m.GetString("hostname") topologyRecovery.AnalysisEntry.AnalyzedInstanceKey.Port = m.GetInt("port") topologyRecovery.AnalysisEntry.Analysis = inst.AnalysisCode(m.GetString("analysis")) topologyRecovery.AnalysisEntry.ClusterDetails.ClusterName = m.GetString("cluster_name") topologyRecovery.AnalysisEntry.ClusterDetails.ClusterAlias = m.GetString("cluster_alias") topologyRecovery.AnalysisEntry.CountSlaves = m.GetUint("count_affected_slaves") topologyRecovery.AnalysisEntry.ReadSlaveHostsFromString(m.GetString("slave_hosts")) topologyRecovery.SuccessorKey = &inst.InstanceKey{} topologyRecovery.SuccessorKey.Hostname = m.GetString("successor_hostname") topologyRecovery.SuccessorKey.Port = m.GetInt("successor_port") topologyRecovery.AnalysisEntry.ClusterDetails.ReadRecoveryInfo() topologyRecovery.AllErrors = strings.Split(m.GetString("all_errors"), "\n") topologyRecovery.LostSlaves.ReadCommaDelimitedList(m.GetString("lost_slaves")) topologyRecovery.ParticipatingInstanceKeys.ReadCommaDelimitedList(m.GetString("participating_instances")) topologyRecovery.Acknowledged = m.GetBool("acknowledged") topologyRecovery.AcknowledgedAt = m.GetString("acknowledged_at") topologyRecovery.AcknowledgedBy = m.GetString("acknowledged_by") topologyRecovery.AcknowledgedComment = m.GetString("acknowledge_comment") res = append(res, topologyRecovery) return nil }) if err != nil { log.Errore(err) } return res, err }
// readRecoveries reads recovery entry/audit entires from topology_recovery func readRecoveries(whereCondition string, limit string) ([]TopologyRecovery, error) { res := []TopologyRecovery{} query := fmt.Sprintf(` select recovery_id, hostname, port, (IFNULL(end_active_period_unixtime, 0) = 0) as is_active, start_active_period, IFNULL(end_active_period_unixtime, 0) as end_active_period_unixtime, IFNULL(end_recovery, '') AS end_recovery, processing_node_hostname, processcing_node_token, ifnull(successor_hostname, '') as successor_hostname, ifnull(successor_port, 0) as successor_port, analysis, cluster_name, cluster_alias, count_affected_slaves, slave_hosts from topology_recovery %s order by recovery_id desc %s `, whereCondition, limit) db, err := db.OpenOrchestrator() if err != nil { goto Cleanup } err = sqlutils.QueryRowsMap(db, query, func(m sqlutils.RowMap) error { topologyRecovery := TopologyRecovery{} topologyRecovery.Id = m.GetInt64("recovery_id") topologyRecovery.IsActive = m.GetBool("is_active") topologyRecovery.RecoveryStartTimestamp = m.GetString("start_active_period") topologyRecovery.RecoveryEndTimestamp = m.GetString("end_recovery") topologyRecovery.ProcessingNodeHostname = m.GetString("processing_node_hostname") topologyRecovery.ProcessingNodeToken = m.GetString("processcing_node_token") topologyRecovery.AnalysisEntry.AnalyzedInstanceKey.Hostname = m.GetString("hostname") topologyRecovery.AnalysisEntry.AnalyzedInstanceKey.Port = m.GetInt("port") topologyRecovery.AnalysisEntry.Analysis = inst.AnalysisCode(m.GetString("analysis")) topologyRecovery.AnalysisEntry.ClusterDetails.ClusterName = m.GetString("cluster_name") topologyRecovery.AnalysisEntry.ClusterDetails.ClusterAlias = m.GetString("cluster_alias") topologyRecovery.AnalysisEntry.CountSlaves = m.GetUint("count_affected_slaves") topologyRecovery.AnalysisEntry.ReadSlaveHostsFromString(m.GetString("slave_hosts")) topologyRecovery.SuccessorKey.Hostname = m.GetString("successor_hostname") topologyRecovery.SuccessorKey.Port = m.GetInt("successor_port") topologyRecovery.AnalysisEntry.ClusterDetails.ReadRecoveryInfo() res = append(res, topologyRecovery) return nil }) Cleanup: if err != nil { log.Errore(err) } return res, err }