public void OrderIrrelevantTest() { const int resourceCount = 99; const int bucketCount = 10; var idealBalance = (int)Math.Floor((double)(resourceCount) / bucketCount); List <int> resources = Enumerable.Range(0, resourceCount).ToList(); List <int> buckets = Enumerable.Range(0, bucketCount).ToList(); var resourceBalancer = new BestFitBalancer <int, int>(buckets, resources); Dictionary <int, List <int> > balancerResults = resourceBalancer.GetDistribution(buckets); ValidateBalance(buckets, resources, balancerResults, idealBalance); // reverse inputs resources.Reverse(); buckets.Reverse(); resourceBalancer = new BestFitBalancer <int, int>(buckets, resources); Dictionary <int, List <int> > balancerResultsFromReversedInputs = resourceBalancer.GetDistribution(buckets); ValidateBalance(buckets, resources, balancerResultsFromReversedInputs, idealBalance); Assert.IsTrue(balancerResults.Keys.SequenceEqual(balancerResultsFromReversedInputs.Keys), "Bucket order"); foreach (int bucket in balancerResults.Keys) { Assert.IsTrue(balancerResults[bucket].SequenceEqual(balancerResultsFromReversedInputs[bucket]), "Resource order"); } }
public void IdealCaseLessResourcesThanBuckets2Test() { const int bucketCount = 100; const int resourceCount = 30; var idealBalance = (int)Math.Floor((double)(resourceCount) / bucketCount); List<int> buckets = Enumerable.Range(0, bucketCount).ToList(); List<int> resources = Enumerable.Range(0, resourceCount).ToList(); var resourceBalancer = new BestFitBalancer<int, int>(buckets, resources); Dictionary<int, List<int>> balancerResults = resourceBalancer.GetDistribution(buckets); ValidateBalance(buckets, resources, balancerResults, idealBalance); }
public void IdealCaseResourcesMatchBucketsTest() { const int bucketCount = 100; const int resourceCount = 100; var idealBalance = (int)Math.Floor((double)(resourceCount) / bucketCount); List <int> buckets = Enumerable.Range(0, bucketCount).ToList(); List <int> resources = Enumerable.Range(0, resourceCount).ToList(); var resourceBalancer = new BestFitBalancer <int, int>(buckets, resources); Dictionary <int, List <int> > balancerResults = resourceBalancer.GetDistribution(buckets); ValidateBalance(buckets, resources, balancerResults, idealBalance); }
public void HalfBucketsActiveTest() { const int resourceCount = 99; const int bucketCount = 10; const int activeBucketCount = bucketCount/2; var idealBalance = (int)Math.Floor((double)(resourceCount) / activeBucketCount); List<int> resources = Enumerable.Range(0, resourceCount).ToList(); List<int> buckets = Enumerable.Range(0, bucketCount).ToList(); List<int> activeBuckets = buckets.Take(activeBucketCount).ToList(); var resourceBalancer = new BestFitBalancer<int, int>(buckets, resources); Dictionary<int, List<int>> balancerResults = resourceBalancer.GetDistribution(activeBuckets); ValidateBalance(activeBuckets, resources, balancerResults, idealBalance); }
public void HalfBucketsActiveTest() { const int resourceCount = 99; const int bucketCount = 10; const int activeBucketCount = bucketCount / 2; var idealBalance = (int)Math.Floor((double)(resourceCount) / activeBucketCount); List <int> resources = Enumerable.Range(0, resourceCount).ToList(); List <int> buckets = Enumerable.Range(0, bucketCount).ToList(); List <int> activeBuckets = buckets.Take(activeBucketCount).ToList(); var resourceBalancer = new BestFitBalancer <int, int>(buckets, resources); Dictionary <int, List <int> > balancerResults = resourceBalancer.GetDistribution(activeBuckets); ValidateBalance(activeBuckets, resources, balancerResults, idealBalance); }
public DeploymentBasedQueueBalancer( ISiloStatusOracle siloStatusOracle, IDeploymentConfiguration deploymentConfig, IStreamQueueMapper queueMapper) { if (siloStatusOracle == null) { throw new ArgumentNullException("siloStatusOracle"); } if (deploymentConfig == null) { throw new ArgumentNullException("deploymentConfig"); } if (queueMapper == null) { throw new ArgumentNullException("queueMapper"); } this.siloStatusOracle = siloStatusOracle; this.deploymentConfig = deploymentConfig; streamQueueMapper = queueMapper; queueBalanceListeners = new List<IStreamQueueBalanceListener>(); mySiloName = this.siloStatusOracle.SiloName; activeSiloNames = new List<string>(); allSiloNames = this.deploymentConfig.GetAllSiloInstanceNames(); List<QueueId> allQueues = streamQueueMapper.GetAllQueues().ToList(); resourceBalancer = new BestFitBalancer<string, QueueId>(allSiloNames, allQueues); // get silo names for all active silos foreach (SiloAddress siloAddress in this.siloStatusOracle.GetApproximateSiloStatuses(true).Keys) { string siloName; if (this.siloStatusOracle.TryGetSiloName(siloAddress, out siloName)) { activeSiloNames.Add(siloName); } } // register for notification of changes to silo status for any silo in the cluster this.siloStatusOracle.SubscribeToSiloStatusEvents(this); }
public void OrderIrrelevantTest() { const int resourceCount = 99; const int bucketCount = 10; var idealBalance = (int)Math.Floor((double)(resourceCount) / bucketCount); List<int> resources = Enumerable.Range(0, resourceCount).ToList(); List<int> buckets = Enumerable.Range(0, bucketCount).ToList(); var resourceBalancer = new BestFitBalancer<int, int>(buckets, resources); Dictionary<int, List<int>> balancerResults = resourceBalancer.GetDistribution(buckets); ValidateBalance(buckets, resources, balancerResults, idealBalance); // reverse inputs resources.Reverse(); buckets.Reverse(); resourceBalancer = new BestFitBalancer<int, int>(buckets, resources); Dictionary<int, List<int>> balancerResultsFromReversedInputs = resourceBalancer.GetDistribution(buckets); ValidateBalance(buckets, resources, balancerResultsFromReversedInputs, idealBalance); Assert.IsTrue(balancerResults.Keys.SequenceEqual(balancerResultsFromReversedInputs.Keys), "Bucket order"); foreach (int bucket in balancerResults.Keys) { Assert.IsTrue(balancerResults[bucket].SequenceEqual(balancerResultsFromReversedInputs[bucket]), "Resource order"); } }
public void IdealCaseRangedTest() { const int MaxResourceCount = 20; const int MaxBucketCount = 20; for (int resourceCount = 1; resourceCount <= MaxResourceCount; resourceCount++) { for (int bucketCount = 1; bucketCount <= MaxBucketCount; bucketCount++) { var idealBalance = (int)Math.Floor((double)(resourceCount) / bucketCount); List<int> buckets = Enumerable.Range(0, bucketCount).ToList(); List<int> resources = Enumerable.Range(0, resourceCount).ToList(); var resourceBalancer = new BestFitBalancer<int, int>(buckets, resources); Dictionary<int, List<int>> balancerResults = resourceBalancer.GetDistribution(buckets); ValidateBalance(buckets, resources, balancerResults, idealBalance); } } }
/// <summary> /// Checks to see if deployment configuration has changed, by adding or removing silos. /// If so, it updates the list of all silo names and creates a new resource balancer. /// This should occure rarely. /// </summary> /// <param name="newSiloNames">new silo names</param> /// <returns>bool, true if list of all silo names has changed</returns> private bool UpdateAllSiloNames(IList<string> newSiloNames) { // Has configured silo names changed if (allSiloNames.Count != newSiloNames.Count || !allSiloNames.ListEquals(newSiloNames)) { // record new list of all instance names allSiloNames = newSiloNames; // rebuild balancer with new list of instance names List<QueueId> allQueues = streamQueueMapper.GetAllQueues().ToList(); resourceBalancer = new BestFitBalancer<string, QueueId>(allSiloNames, allQueues); return true; } return false; }