예제 #1
0
        private static List <ConfigurationAction> GetActionsForEventualConsistency(string ContainerName, ReplicaConfiguration config, SubSLA subSLA, ClientUsageData usage, string slaId)
        {
            List <ConfigurationAction> result = new List <ConfigurationAction>();

            int desiredLatency = subSLA.Latency;

            // we first compute the maximum probability of meeting the latency with current replicas.
            float currentMaxProbability = usage.ServerRTTs
                                          .Where(sr => config.PrimaryServers.Contains(sr.Key) || config.SecondaryServers.Contains(sr.Key))
                                          .Max(sr => sr.Value.ProbabilityOfFindingValueLessThanGiven(desiredLatency));


            // for any non-replica with higher probabiliy than both the currentMaxProbability and MIN_ACCEPTABLE_PROB_FOR_EVENTUAL_CONS, we create a new action.
            IEnumerable <string> chosenServers = usage.ServerRTTs
                                                 .Where(sr => config.NonReplicaServers.Contains(sr.Key) &&
                                                        sr.Value.ProbabilityOfFindingValueLessThanGiven(desiredLatency) > currentMaxProbability &&
                                                        sr.Value.ProbabilityOfFindingValueLessThanGiven(desiredLatency) > ConstPool.MIN_ACCEPTABLE_PROB_FOR_CONS)
                                                 .Select(sr => sr.Key);

            foreach (string server in chosenServers)
            {
                float utilityGain = (usage.ServerRTTs[server].ProbabilityOfFindingValueLessThanGiven(desiredLatency) - currentMaxProbability) * subSLA.Utility; /* * subSLA.NumberOfMisses*/
                result.Add(new AddSecondaryServer(ContainerName, server, utilityGain, slaId, ConfigurationActionSource.NonConstraint, numberOfReads, numberOfWrites));
            }

            return(result);
        }
예제 #2
0
        private static List <ConfigurationAction> GetActionsFor_RMW_MON_CAUSAL_BOUNDED_Consistency(string ContainerName, ReplicaConfiguration config, SubSLA subSLA, ClientUsageData usage, string slaId)
        {
            List <ConfigurationAction> result = new List <ConfigurationAction>();

            int desiredLatency = subSLA.Latency;

            float  currentMaxProbability = 0;
            string nearestServer         = null;

            // Find the closest replica, i.e. the one that has the maximum probability of meeting the desired latency
            foreach (string server in usage.ServerRTTs.Keys)
            {
                if (config.PrimaryServers.Contains(server) || config.SecondaryServers.Contains(server))
                {
                    float prob = usage.ServerRTTs[server].ProbabilityOfFindingValueLessThanGiven(desiredLatency);
                    if (prob > currentMaxProbability)
                    {
                        currentMaxProbability = prob;
                        nearestServer         = server;
                    }
                }
            }

            // One action is to reduce the sync period for the nearest replica.
            if (nearestServer != null && !config.PrimaryServers.Contains(nearestServer))
            {
                int oldInterval = config.GetSyncPeriod(nearestServer);

                if ((oldInterval * ConstPool.ADJUSTING_SYNC_INTERVAL_MULTIPLIER) > ConstPool.MINIMUM_ALLOWED_SYNC_INTERVAL)
                {
                    // TODO: This can't be right.  The utility gain for adjusting the sync period is hard to predict.
                    float utilityGain = currentMaxProbability * subSLA.Utility; /* * subSLA.NumberOfMisses*/
                    result.Add(new AdjustSyncPeriod(ContainerName, nearestServer, utilityGain, slaId, ConfigurationActionSource.NonConstraint, numberOfReads, numberOfWrites));
                }
            }

            // For any non-replica with higher probabiliy than both the currentMaxProbability and MIN_ACCEPTABLE_PROB_FOR_EVENTUAL_CONS, we create a new action.
            IEnumerable <string> chosenServers = usage.ServerRTTs
                                                 .Where(sr => config.NonReplicaServers.Contains(sr.Key) &&
                                                        sr.Value.ProbabilityOfFindingValueLessThanGiven(desiredLatency) > currentMaxProbability &&
                                                        sr.Value.ProbabilityOfFindingValueLessThanGiven(desiredLatency) > ConstPool.MIN_ACCEPTABLE_PROB_FOR_CONS)
                                                 .Select(sr => sr.Key);

            foreach (string server in chosenServers)
            {
                float utilityGain = (usage.ServerRTTs[server].ProbabilityOfFindingValueLessThanGiven(desiredLatency) - currentMaxProbability) * subSLA.Utility; /* * subSLA.NumberOfMisses*/
                result.Add(new AddSecondaryServer(ContainerName, server, utilityGain, slaId, ConfigurationActionSource.NonConstraint, numberOfReads, numberOfWrites));
            }

            return(result);
        }
예제 #3
0
        private static List <ConfigurationAction> GetActionsForStrongConsistency(string ContainerName, ReplicaConfiguration config, SubSLA subSLA, ClientUsageData usage, string slaId)
        {
            List <ConfigurationAction> result = new List <ConfigurationAction>();

            int desiredLatency = subSLA.Latency;

            // we first compute the maximum probability of meeting the latency with primary servers.
            float currentMaxProbability = usage.ServerRTTs
                                          .Where(sr => config.PrimaryServers.Contains(sr.Key))
                                          .Max(sr => sr.Value.ProbabilityOfFindingValueLessThanGiven(desiredLatency));

            // for any secondary replica with higher probability than the primary, we create an action to make that secondary the solo primary.
            // TODO: shouldn't this just pick one secondary with the max probability, i.e. why try to make multiple solo primaries?
            IEnumerable <string> chosenSecondaries = usage.ServerRTTs
                                                     .Where(sr => config.SecondaryServers.Contains(sr.Key) &&
                                                            !config.ReadOnlySecondaryServers.Contains(sr.Key) &&
                                                            sr.Value.ProbabilityOfFindingValueLessThanGiven(desiredLatency) > currentMaxProbability)
                                                     .Select(sr => sr.Key);

            foreach (string server in chosenSecondaries)
            {
                float utilityGain = (usage.ServerRTTs[server].ProbabilityOfFindingValueLessThanGiven(desiredLatency) - currentMaxProbability) * subSLA.Utility; /* * subSLA.NumberOfMisses*/
                result.Add(new MakeSoloPrimaryServer(ContainerName, server, utilityGain, slaId, ConfigurationActionSource.NonConstraint, numberOfReads, numberOfWrites));
            }

            // for any server with higher probabiliy than the primary, we create an action to make that server one of the primaries.
            IEnumerable <string> chosenServers = usage.ServerRTTs
                                                 .Where(sr => (config.SecondaryServers.Contains(sr.Key) || config.NonReplicaServers.Contains(sr.Key)) &&
                                                        !config.ReadOnlySecondaryServers.Contains(sr.Key) &&
                                                        sr.Value.ProbabilityOfFindingValueLessThanGiven(desiredLatency) > currentMaxProbability)
                                                 .Select(sr => sr.Key);

            foreach (string server in chosenServers)
            {
                float utilityGain = (usage.ServerRTTs[server].ProbabilityOfFindingValueLessThanGiven(desiredLatency) - currentMaxProbability) * subSLA.Utility; /* * subSLA.NumberOfMisses*/
                result.Add(new AddPrimaryServer(ContainerName, server, utilityGain, slaId, ConfigurationActionSource.NonConstraint, numberOfReads, numberOfWrites));
            }

            return(result);
        }