Exemplo n.º 1
0
        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");
            }
        }
Exemplo n.º 2
0
 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);
 }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
 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);
 }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 7
0
        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");
            }
        }
Exemplo n.º 8
0
        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;
 }