// BlancePlanPIndexes invokes the blance library's generic // PlanNextMap() algorithm to create a new pindex layout plan. func BlancePlanPIndexes(mode string, indexDef *IndexDef, planPIndexesForIndex map[string]*PlanPIndex, planPIndexesPrev *PlanPIndexes, nodeUUIDsAll []string, nodeUUIDsToAdd []string, nodeUUIDsToRemove []string, nodeWeights map[string]int, nodeHierarchy map[string]string) []string { model, modelConstraints := BlancePartitionModel(indexDef) // First, reconstruct previous blance map from planPIndexesPrev. blancePrevMap := BlanceMap(planPIndexesForIndex, planPIndexesPrev) partitionWeights := indexDef.PlanParams.PIndexWeights stateStickiness := map[string]int(nil) if mode == "failover" { stateStickiness = map[string]int{"primary": 100000} } // Compute nodeUUIDsAllForIndex by rotating the nodeUUIDsAll based // on a function of index name, so that multiple indexes will have // layouts that favor different starting nodes, but whose // computation is repeatable. var nodeUUIDsAllForIndex []string h := crc32.NewIEEE() io.WriteString(h, indexDef.Name) next := sort.SearchStrings(nodeUUIDsAll, fmt.Sprintf("%x", h.Sum32())) for range nodeUUIDsAll { if next >= len(nodeUUIDsAll) { next = 0 } nodeUUIDsAllForIndex = append(nodeUUIDsAllForIndex, nodeUUIDsAll[next]) next++ } blanceNextMap, warnings := blance.PlanNextMap(blancePrevMap, nodeUUIDsAllForIndex, nodeUUIDsToRemove, nodeUUIDsToAdd, model, modelConstraints, partitionWeights, stateStickiness, nodeWeights, nodeHierarchy, indexDef.PlanParams.HierarchyRules) for planPIndexName, blancePartition := range blanceNextMap { planPIndex := planPIndexesForIndex[planPIndexName] planPIndex.Nodes = map[string]*PlanPIndexNode{} for i, nodeUUID := range blancePartition.NodesByState["primary"] { if i >= model["primary"].Constraints { break } canRead := true canWrite := true nodePlanParam := GetNodePlanParam(indexDef.PlanParams.NodePlanParams, nodeUUID, indexDef.Name, planPIndexName) if nodePlanParam != nil { canRead = nodePlanParam.CanRead canWrite = nodePlanParam.CanWrite } planPIndex.Nodes[nodeUUID] = &PlanPIndexNode{ CanRead: canRead, CanWrite: canWrite, Priority: 0, } } for i, nodeUUID := range blancePartition.NodesByState["replica"] { if i >= model["replica"].Constraints { break } canRead := true canWrite := true nodePlanParam := GetNodePlanParam(indexDef.PlanParams.NodePlanParams, nodeUUID, indexDef.Name, planPIndexName) if nodePlanParam != nil { canRead = nodePlanParam.CanRead canWrite = nodePlanParam.CanWrite } planPIndex.Nodes[nodeUUID] = &PlanPIndexNode{ CanRead: canRead, CanWrite: canWrite, Priority: i + 1, } } } return warnings }
// BlancePlanPIndexes invokes the blance library's generic // PlanNextMap() algorithm to create a new pindex layout plan. func BlancePlanPIndexes(mode string, indexDef *IndexDef, planPIndexesForIndex map[string]*PlanPIndex, planPIndexesPrev *PlanPIndexes, nodeUUIDsAll []string, nodeUUIDsToAdd []string, nodeUUIDsToRemove []string, nodeWeights map[string]int, nodeHierarchy map[string]string) []string { model, modelConstraints := BlancePartitionModel(indexDef) // First, reconstruct previous blance map from planPIndexesPrev. blancePrevMap := BlanceMap(planPIndexesForIndex, planPIndexesPrev) partitionWeights := indexDef.PlanParams.PIndexWeights stateStickiness := map[string]int(nil) if mode == "failover" { stateStickiness = map[string]int{"primary": 100000} } blanceNextMap, warnings := blance.PlanNextMap(blancePrevMap, nodeUUIDsAll, nodeUUIDsToRemove, nodeUUIDsToAdd, model, modelConstraints, partitionWeights, stateStickiness, nodeWeights, nodeHierarchy, indexDef.PlanParams.HierarchyRules) for planPIndexName, blancePartition := range blanceNextMap { planPIndex := planPIndexesForIndex[planPIndexName] planPIndex.Nodes = map[string]*PlanPIndexNode{} for _, nodeUUID := range blancePartition.NodesByState["primary"] { canRead := true canWrite := true nodePlanParam := GetNodePlanParam(indexDef.PlanParams.NodePlanParams, nodeUUID, indexDef.Name, planPIndexName) if nodePlanParam != nil { canRead = nodePlanParam.CanRead canWrite = nodePlanParam.CanWrite } planPIndex.Nodes[nodeUUID] = &PlanPIndexNode{ CanRead: canRead, CanWrite: canWrite, Priority: 0, } } for i, nodeUUID := range blancePartition.NodesByState["replica"] { canRead := true canWrite := true nodePlanParam := GetNodePlanParam(indexDef.PlanParams.NodePlanParams, nodeUUID, indexDef.Name, planPIndexName) if nodePlanParam != nil { canRead = nodePlanParam.CanRead canWrite = nodePlanParam.CanWrite } planPIndex.Nodes[nodeUUID] = &PlanPIndexNode{ CanRead: canRead, CanWrite: canWrite, Priority: i + 1, } } } return warnings }