func voteSl(swm *swarm.Swarm, topology *structs.Topology) (string, error) { maxMasterLogFileNum := 0 maxReadMasterLogPos := 0 ch := make(chan []interface{}) maxDbName := "" for k, v := range topology.DataNodeGroup["default"] { if v.Type == consts.Slave && v.Status == consts.Normal { dbName := k go func() { masterLogFileNum, readMasterLogPos := swm.PositionGet(dbName) log.WithFields(log.Fields{ "SlaveName": dbName, "MasterLogFileNum": masterLogFileNum, "ReadMasterLogPos": readMasterLogPos, }).Debug("Sl vote") pos := []interface{}{dbName, masterLogFileNum, readMasterLogPos} ch <- pos }() } } for i := 0; i < topology.DataNodeGroupNormalCount["default"]-2; i++ { pos := <-ch dbName := pos[0].(string) masterLogFileNum := pos[1].(int) readMasterLogPos := pos[2].(int) if masterLogFileNum > maxMasterLogFileNum { if readMasterLogPos > maxReadMasterLogPos { maxMasterLogFileNum = masterLogFileNum maxReadMasterLogPos = readMasterLogPos maxDbName = dbName } } } // all sl unavaliable if maxDbName == "" { return "", errors.New( "when isolate M|Sb, all slave are unavilable for vote, isolate failed and return to hope health check enter sl auto isolate") } maxDbInfo := topology.DataNodeGroup["default"][maxDbName] log.WithFields(log.Fields{ "winer": maxDbName + "(" + maxDbInfo.Ip + ":" + strconv.Itoa(maxDbInfo.Port) + ")", }).Debug("Sl vote") return maxDbName, nil }