def test_a_heavily_biased_sample_of_100_out_of_1000_elements(self):
        sample = ExponentiallyDecayingSample(1000, 0.01)
        for i in xrange(100):
            sample.update(i)
        snapshot = sample.get_snapshot()

        self.assertEqual(sample.size(), 100)
        self.assertEqual(snapshot.size(), 100)

        for i in snapshot.get_values():
            self.assertTrue(i < 100 and i >= 0)
    def test_a_sample_of_100_out_of_10_elements(self):
        sample = ExponentiallyDecayingSample(100, 0.99)
        for i in xrange(10):
            sample.update(i)
        snapshot = sample.get_snapshot()

        self.assertEqual(sample.size(), 10)
        self.assertEqual(snapshot.size(), 10)
        self.assertAlmostEqual(snapshot.get_median(), 4.5)

        for i in snapshot.get_values():
            self.assertTrue(i < 10 and i >= 0)
示例#3
0
    def get_biased(klass):
        """
        Create a new instance of L{Histogram} that uses an L{ExponentiallyDecayingSample}
        with sample size L{DEFAULT_SAMPLE_SIZE} and alpha L{DEFAULT_ALPHA}.

        @return: L{Histogram}
        """
        return klass(ExponentiallyDecayingSample(klass.DEFAULT_SAMPLE_SIZE, klass.DEFAULT_ALPHA))
    def test_long_period_of_inactivity_should_not_corrupt_sampling_state(self):
        twisted_clock = Clock()
        sample = ExponentiallyDecayingSample(10, 0.015, twisted_clock.seconds)
        for i in xrange(1000):
            sample.update(1000 + i)
            twisted_clock.advance(0.1)

        self.assertTrue(sample.get_snapshot().size() == 10)
        self._assert_all_values_between(sample, 1000, 2000)

        twisted_clock.advance(15*3600)
        sample.update(2000)
        self.assertTrue(sample.get_snapshot().size() == 2)
        self._assert_all_values_between(sample, 1000, 3000)

        for i in xrange(1000):
            sample.update(3000 + i)
            twisted_clock.advance(0.1)

        self.assertTrue(sample.get_snapshot().size() == 10)
        self._assert_all_values_between(sample, 3000, 4000)
    def test_a_heavily_biased_sample_of_100_out_of_1000_elements(self):
        sample = ExponentiallyDecayingSample(1000, 0.01)
        for i in xrange(100):
            sample.update(i)
        snapshot = sample.get_snapshot()

        self.assertEqual(sample.size(), 100)
        self.assertEqual(snapshot.size(), 100)

        for i in snapshot.get_values():
            self.assertTrue(i < 100 and i >= 0)
    def test_a_sample_of_100_out_of_10_elements(self):
        sample = ExponentiallyDecayingSample(100, 0.99)
        for i in xrange(10):
            sample.update(i)
        snapshot = sample.get_snapshot()

        self.assertEqual(sample.size(), 10)
        self.assertEqual(snapshot.size(), 10)
        self.assertAlmostEqual(snapshot.get_median(), 4.5)

        for i in snapshot.get_values():
            self.assertTrue(i < 10 and i >= 0)
    def test_long_period_of_inactivity_should_not_corrupt_sampling_state(self):
        twisted_clock = Clock()
        sample = ExponentiallyDecayingSample(10, 0.015, twisted_clock.seconds)
        for i in xrange(1000):
            sample.update(1000 + i)
            twisted_clock.advance(0.1)

        self.assertTrue(sample.get_snapshot().size() == 10)
        self._assert_all_values_between(sample, 1000, 2000)

        twisted_clock.advance(15 * 3600)
        sample.update(2000)
        self.assertTrue(sample.get_snapshot().size() == 2)
        self._assert_all_values_between(sample, 1000, 3000)

        for i in xrange(1000):
            sample.update(3000 + i)
            twisted_clock.advance(0.1)

        self.assertTrue(sample.get_snapshot().size() == 10)
        self._assert_all_values_between(sample, 3000, 4000)
示例#8
0
    def __init__(self, id_, serverList, replicaSelectionStrategy,
                 accessPattern, replicationFactor, backpressure,
                 shadowReadRatio, rateInterval, cubicC, cubicSmax, cubicBeta,
                 hysterisisFactor, demandWeight, costExponent,
                 concurrencyWeight):
        self.id = id_
        self.serverList = serverList
        self.accessPattern = accessPattern
        self.replicationFactor = replicationFactor
        self.REPLICA_SELECTION_STRATEGY = replicaSelectionStrategy
        self.pendingRequestsMonitor = \
            Simulation.Monitor(name="PendingRequests")
        self.latencyTrackerMonitor = Simulation.Monitor(name="ResponseHandler")
        self.rateMonitor = Simulation.Monitor(name="AlphaMonitor")
        self.receiveRateMonitor = Simulation.Monitor(name="ReceiveRateMonitor")
        self.tokenMonitor = Simulation.Monitor(name="TokenMonitor")
        self.edScoreMonitor = Simulation.Monitor(name="edScoreMonitor")
        self.backpressure = backpressure  # True/Flase
        self.shadowReadRatio = shadowReadRatio
        self.demandWeight = demandWeight
        self.costExponent = costExponent
        self.concurrencyWeight = concurrencyWeight

        # Book-keeping and metrics to be recorded follow...

        # Number of outstanding requests at the client
        self.pendingRequestsMap = {node: 0 for node in serverList}

        # Number of outstanding requests times oracle-service time of replica
        self.pendingXserviceMap = {node: 0 for node in serverList}

        # Last-received response time of server
        self.responseTimesMap = {node: 0 for node in serverList}

        # Used to track response time from the perspective of the client
        self.taskSentTimeTracker = {}
        self.taskArrivalTimeTracker = {}
        self.taskBatchCounter = {}

        # Record waiting and service times as relayed by the server
        self.expectedDelayMap = {node: {} for node in serverList}
        self.lastSeen = {node: 0 for node in serverList}

        # Round robin parameters
        self.rrIndex = {node: 0 for node in serverList}

        # Rate limiters per replica
        self.rateLimiters = {
            node: RateLimiter("RL-%s" % node.id, self, 10, rateInterval)
            for node in serverList
        }
        self.lastRateDecrease = {node: 0 for node in serverList}
        self.valueOfLastDecrease = {node: 10 for node in serverList}
        self.receiveRate = {
            node: ReceiveRate("RL-%s" % node.id, rateInterval)
            for node in serverList
        }
        self.lastRateIncrease = {node: 0 for node in serverList}
        self.rateInterval = rateInterval

        # Parameters for congestion control
        self.cubicC = cubicC
        self.cubicSmax = cubicSmax
        self.cubicBeta = cubicBeta
        self.hysterisisFactor = hysterisisFactor

        # Parameters for Refresh selection
        self.sendtime = {node: 0.00000000 for node in serverList}

        # Backpressure related initialization
        if (backpressure is True):
            self.backpressureSchedulers = \
                {node: BackpressureScheduler("BP-%s" % node.id, self)
                 for node in serverList}
            for node in serverList:
                Simulation.activate(self.backpressureSchedulers[node],
                                    self.backpressureSchedulers[node].run(),
                                    at=Simulation.now())

        # ds-metrics
        if (replicaSelectionStrategy == "ds"):
            self.latencyEdma = {
                node: ExponentiallyDecayingSample(100, 0.75, self.clock)
                for node in serverList
            }
            self.dsScores = {node: 0 for node in serverList}
            for node, rateLimiter in self.rateLimiters.items():
                ds = DynamicSnitch(self, 100)
                Simulation.activate(ds, ds.run(), at=Simulation.now())