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); }
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); }
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); }