func (pool *LoadBalancedPool) Update(instanceInfos []LBPoolInstanceInfo) { pool.lock.Lock() defer pool.lock.Unlock() newInstances := make(map[string]*instancePool) var newInstanceList instancePoolSlice for _, instanceInfo := range instanceInfos { if _, ok := newInstances[instanceInfo.Addr]; !ok { var instance *instancePool if instance, ok = pool.instances[instanceInfo.Addr]; !ok { instance = pool.newInstancePool(instanceInfo) } else { // Update `instanceId` for given instance since same host:port address // might have a new `instanceId` now. instance.instanceId = instanceInfo.InstanceId } newInstances[instanceInfo.Addr] = instance newInstanceList = append(newInstanceList, instance) } } switch pool.strategy { case LBRoundRobin: // In RoundRobin strategy, InstanceList is a randomly shuffled list of instances. for i, _ := range newInstanceList { randIdx := rand2.Intn(i + 1) newInstanceList.Swap(i, randIdx) } case LBSortedFixed: // In SortedFixed strategy, InstanceList is a sorted list, sorted by instanceId. sort.Sort(newInstanceList) case LBShuffledFixed: // In ShuffledFixed strategy, InstanceList is a deterministically shuffled list. sort.Sort(shuffleSortHelper{newInstanceList, pool.shuffleSeed}) } for addr, instancePool := range pool.instances { // Close out all InstancePools that are not needed anymore. if _, ok := newInstances[addr]; !ok { instancePool.Close() } } pool.instances = newInstances pool.instanceList = newInstanceList pool.markDownUntil = make([]int64, len(newInstanceList)) }
func (pool *LoadBalancedPool) Update(instanceInfos []LBPoolInstanceInfo) { pool.lock.Lock() defer pool.lock.Unlock() newInstances := make(map[string]*instancePool) var newInstanceList instancePoolSlice for _, instanceInfo := range instanceInfos { if _, ok := newInstances[instanceInfo.Addr]; !ok { var instance *instancePool if instance, ok = pool.instances[instanceInfo.Addr]; !ok { instance = pool.newInstancePool(instanceInfo) } newInstances[instanceInfo.Addr] = instance newInstanceList = append(newInstanceList, instance) } } switch pool.strategy { case LBRoundRobin: // In RoundRobin strategy, InstanceList is a randomly shuffled list of instances. for i, _ := range newInstanceList { randIdx := rand2.Intn(i + 1) newInstanceList.Swap(i, randIdx) } case LBFixed: // In Fixed strategy, InstanceList is a sorted list, sorted by instanceId. sort.Sort(newInstanceList) } for addr, instancePool := range pool.instances { // Close out all InstancePools that are not needed anymore. if _, ok := newInstances[addr]; !ok { instancePool.Close() } } pool.instances = newInstances pool.instanceList = newInstanceList pool.markDownUntil = make([]int64, len(newInstanceList)) }
func shuffle(pools []*ResourceLocationPool) { for i := len(pools) - 1; i > 0; i-- { idx := rand2.Intn(i + 1) pools[i], pools[idx] = pools[idx], pools[i] } }