private TimeBasedLimiter() { if (FixedIntervalRateLimiter.class.getName().equals( conf.getClass(RateLimiter.QUOTA_RATE_LIMITER_CONF_KEY, AverageIntervalRateLimiter.class) .getName())) { reqsLimiter = new FixedIntervalRateLimiter(); reqSizeLimiter = new FixedIntervalRateLimiter(); writeReqsLimiter = new FixedIntervalRateLimiter(); writeSizeLimiter = new FixedIntervalRateLimiter(); readReqsLimiter = new FixedIntervalRateLimiter(); readSizeLimiter = new FixedIntervalRateLimiter(); reqCapacityUnitLimiter = new FixedIntervalRateLimiter(); writeCapacityUnitLimiter = new FixedIntervalRateLimiter(); readCapacityUnitLimiter = new FixedIntervalRateLimiter(); } else { reqsLimiter = new AverageIntervalRateLimiter(); reqSizeLimiter = new AverageIntervalRateLimiter(); writeReqsLimiter = new AverageIntervalRateLimiter(); writeSizeLimiter = new AverageIntervalRateLimiter(); readReqsLimiter = new AverageIntervalRateLimiter(); readSizeLimiter = new AverageIntervalRateLimiter(); reqCapacityUnitLimiter = new AverageIntervalRateLimiter(); writeCapacityUnitLimiter = new AverageIntervalRateLimiter(); readCapacityUnitLimiter = new AverageIntervalRateLimiter(); } }
@Test public void testLimiterCompensationOverflow() throws InterruptedException { long limit = Long.MAX_VALUE - 1; long guessNumber = 100; // For unconfigured limiters, it is supposed to use as much as possible RateLimiter avgLimiter = new AverageIntervalRateLimiter(); avgLimiter.set(limit, TimeUnit.SECONDS); assertEquals(limit, avgLimiter.getAvailable()); // The initial guess is that 100 bytes. assertTrue(avgLimiter.canExecute(guessNumber)); avgLimiter.consume(guessNumber); // Make sure that available is whatever left assertTrue((limit - guessNumber) == avgLimiter.getAvailable()); // Manually set avil to simulate that another thread call canExecute(). // It is simulated by consume(). avgLimiter.consume(-80); assertTrue((limit - guessNumber + 80) == avgLimiter.getAvailable()); // Now thread1 compensates 80 avgLimiter.consume(-80); assertTrue(limit == avgLimiter.getAvailable()); } }
@Test public void testOverconsumptionAverageIntervalRefillStrategy() { RateLimiter limiter = new AverageIntervalRateLimiter(); limiter.set(10, TimeUnit.SECONDS); // 10 resources are available, but we need to consume 20 resources // Verify that we have to wait at least 1.1sec to have 1 resource available assertTrue(limiter.canExecute()); limiter.consume(20); // To consume 1 resource wait for 100ms assertEquals(100, limiter.waitInterval(1)); // To consume 10 resource wait for 1000ms assertEquals(1000, limiter.waitInterval(10)); limiter.setNextRefillTime(limiter.getNextRefillTime() - 900); // Verify that after 1sec the 1 resource is available assertTrue(limiter.canExecute(1)); limiter.setNextRefillTime(limiter.getNextRefillTime() - 100); // Verify that after 1sec the 10 resource is available assertTrue(limiter.canExecute()); assertEquals(0, limiter.waitInterval()); }
@Test public void testCanExecuteOfAverageIntervalRateLimiter() throws InterruptedException { RateLimiter limiter = new AverageIntervalRateLimiter(); // when set limit is 100 per sec, this AverageIntervalRateLimiter will support at max 200 per sec limiter.set(100, TimeUnit.SECONDS); limiter.setNextRefillTime(EnvironmentEdgeManager.currentTime()); assertEquals(50, testCanExecuteByRate(limiter, 50)); // refill the avail to limit limiter.set(100, TimeUnit.SECONDS); limiter.setNextRefillTime(EnvironmentEdgeManager.currentTime()); assertEquals(100, testCanExecuteByRate(limiter, 100)); // refill the avail to limit limiter.set(100, TimeUnit.SECONDS); limiter.setNextRefillTime(EnvironmentEdgeManager.currentTime()); assertEquals(200, testCanExecuteByRate(limiter, 200)); // refill the avail to limit limiter.set(100, TimeUnit.SECONDS); limiter.setNextRefillTime(EnvironmentEdgeManager.currentTime()); assertEquals(200, testCanExecuteByRate(limiter, 500)); }
private void testWaitInterval(final TimeUnit timeUnit, final long limit, final long expectedWaitInterval) { RateLimiter limiter = new AverageIntervalRateLimiter(); limiter.set(limit, timeUnit);
@Test public void testUnconfiguredLimiters() throws InterruptedException { ManualEnvironmentEdge testEdge = new ManualEnvironmentEdge(); EnvironmentEdgeManager.injectEdge(testEdge); long limit = Long.MAX_VALUE; // For unconfigured limiters, it is supposed to use as much as possible RateLimiter avgLimiter = new AverageIntervalRateLimiter(); RateLimiter fixLimiter = new FixedIntervalRateLimiter(); assertEquals(limit, avgLimiter.getAvailable()); assertEquals(limit, fixLimiter.getAvailable()); assertTrue(avgLimiter.canExecute(limit)); avgLimiter.consume(limit); assertTrue(fixLimiter.canExecute(limit)); fixLimiter.consume(limit); // Make sure that available is Long.MAX_VALUE assertTrue(limit == avgLimiter.getAvailable()); assertTrue(limit == fixLimiter.getAvailable()); // after 100 millseconds, it should be able to execute limit as well testEdge.incValue(100); assertTrue(avgLimiter.canExecute(limit)); avgLimiter.consume(limit); assertTrue(fixLimiter.canExecute(limit)); fixLimiter.consume(limit); // Make sure that available is Long.MAX_VALUE assertTrue(limit == avgLimiter.getAvailable()); assertTrue(limit == fixLimiter.getAvailable()); EnvironmentEdgeManager.reset(); }
@Test public void testRefillOfAverageIntervalRateLimiter() throws InterruptedException { RateLimiter limiter = new AverageIntervalRateLimiter(); limiter.set(60, TimeUnit.SECONDS); assertEquals(60, limiter.getAvailable()); // first refill, will return the number same with limit assertEquals(60, limiter.refill(limiter.getLimit())); limiter.consume(30); // after 0.2 sec, refill should return 12 limiter.setNextRefillTime(limiter.getNextRefillTime() - 200); assertEquals(12, limiter.refill(limiter.getLimit())); // after 0.5 sec, refill should return 30 limiter.setNextRefillTime(limiter.getNextRefillTime() - 500); assertEquals(30, limiter.refill(limiter.getLimit())); // after 1 sec, refill should return 60 limiter.setNextRefillTime(limiter.getNextRefillTime() - 1000); assertEquals(60, limiter.refill(limiter.getLimit())); // after more than 1 sec, refill should return at max 60 limiter.setNextRefillTime(limiter.getNextRefillTime() - 3000); assertEquals(60, limiter.refill(limiter.getLimit())); limiter.setNextRefillTime(limiter.getNextRefillTime() - 5000); assertEquals(60, limiter.refill(limiter.getLimit())); }
long limit = Long.MAX_VALUE - 1; RateLimiter avgLimiter = new AverageIntervalRateLimiter(); avgLimiter.set(limit, TimeUnit.SECONDS); RateLimiter fixLimiter = new FixedIntervalRateLimiter();
private TimeBasedLimiter() { if (FixedIntervalRateLimiter.class.getName().equals( conf.getClass(RateLimiter.QUOTA_RATE_LIMITER_CONF_KEY, AverageIntervalRateLimiter.class) .getName())) { reqsLimiter = new FixedIntervalRateLimiter(); reqSizeLimiter = new FixedIntervalRateLimiter(); writeReqsLimiter = new FixedIntervalRateLimiter(); writeSizeLimiter = new FixedIntervalRateLimiter(); readReqsLimiter = new FixedIntervalRateLimiter(); readSizeLimiter = new FixedIntervalRateLimiter(); } else { reqsLimiter = new AverageIntervalRateLimiter(); reqSizeLimiter = new AverageIntervalRateLimiter(); writeReqsLimiter = new AverageIntervalRateLimiter(); writeSizeLimiter = new AverageIntervalRateLimiter(); readReqsLimiter = new AverageIntervalRateLimiter(); readSizeLimiter = new AverageIntervalRateLimiter(); } }
@Test public void testLimiterCompensationOverflow() throws InterruptedException { long limit = Long.MAX_VALUE - 1; long guessNumber = 100; // For unconfigured limiters, it is supposed to use as much as possible RateLimiter avgLimiter = new AverageIntervalRateLimiter(); avgLimiter.set(limit, TimeUnit.SECONDS); assertEquals(limit, avgLimiter.getAvailable()); // The initial guess is that 100 bytes. assertTrue(avgLimiter.canExecute(guessNumber)); avgLimiter.consume(guessNumber); // Make sure that available is whatever left assertTrue((limit - guessNumber) == avgLimiter.getAvailable()); // Manually set avil to simulate that another thread call canExecute(). // It is simulated by consume(). avgLimiter.consume(-80); assertTrue((limit - guessNumber + 80) == avgLimiter.getAvailable()); // Now thread1 compensates 80 avgLimiter.consume(-80); assertTrue(limit == avgLimiter.getAvailable()); } }
@Test public void testOverconsumptionAverageIntervalRefillStrategy() { RateLimiter limiter = new AverageIntervalRateLimiter(); limiter.set(10, TimeUnit.SECONDS); // 10 resources are available, but we need to consume 20 resources // Verify that we have to wait at least 1.1sec to have 1 resource available assertTrue(limiter.canExecute()); limiter.consume(20); // To consume 1 resource wait for 100ms assertEquals(100, limiter.waitInterval(1)); // To consume 10 resource wait for 1000ms assertEquals(1000, limiter.waitInterval(10)); limiter.setNextRefillTime(limiter.getNextRefillTime() - 900); // Verify that after 1sec the 1 resource is available assertTrue(limiter.canExecute(1)); limiter.setNextRefillTime(limiter.getNextRefillTime() - 100); // Verify that after 1sec the 10 resource is available assertTrue(limiter.canExecute()); assertEquals(0, limiter.waitInterval()); }
@Test public void testCanExecuteOfAverageIntervalRateLimiter() throws InterruptedException { RateLimiter limiter = new AverageIntervalRateLimiter(); // when set limit is 100 per sec, this AverageIntervalRateLimiter will support at max 200 per sec limiter.set(100, TimeUnit.SECONDS); limiter.setNextRefillTime(EnvironmentEdgeManager.currentTime()); assertEquals(50, testCanExecuteByRate(limiter, 50)); // refill the avail to limit limiter.set(100, TimeUnit.SECONDS); limiter.setNextRefillTime(EnvironmentEdgeManager.currentTime()); assertEquals(100, testCanExecuteByRate(limiter, 100)); // refill the avail to limit limiter.set(100, TimeUnit.SECONDS); limiter.setNextRefillTime(EnvironmentEdgeManager.currentTime()); assertEquals(200, testCanExecuteByRate(limiter, 200)); // refill the avail to limit limiter.set(100, TimeUnit.SECONDS); limiter.setNextRefillTime(EnvironmentEdgeManager.currentTime()); assertEquals(200, testCanExecuteByRate(limiter, 500)); }
private void testWaitInterval(final TimeUnit timeUnit, final long limit, final long expectedWaitInterval) { RateLimiter limiter = new AverageIntervalRateLimiter(); limiter.set(limit, timeUnit);
@Test public void testRefillOfAverageIntervalRateLimiter() throws InterruptedException { RateLimiter limiter = new AverageIntervalRateLimiter(); limiter.set(60, TimeUnit.SECONDS); assertEquals(60, limiter.getAvailable()); // first refill, will return the number same with limit assertEquals(60, limiter.refill(limiter.getLimit())); limiter.consume(30); // after 0.2 sec, refill should return 12 limiter.setNextRefillTime(limiter.getNextRefillTime() - 200); assertEquals(12, limiter.refill(limiter.getLimit())); // after 0.5 sec, refill should return 30 limiter.setNextRefillTime(limiter.getNextRefillTime() - 500); assertEquals(30, limiter.refill(limiter.getLimit())); // after 1 sec, refill should return 60 limiter.setNextRefillTime(limiter.getNextRefillTime() - 1000); assertEquals(60, limiter.refill(limiter.getLimit())); // after more than 1 sec, refill should return at max 60 limiter.setNextRefillTime(limiter.getNextRefillTime() - 3000); assertEquals(60, limiter.refill(limiter.getLimit())); limiter.setNextRefillTime(limiter.getNextRefillTime() - 5000); assertEquals(60, limiter.refill(limiter.getLimit())); }
@Test public void testUnconfiguredLimiters() throws InterruptedException { ManualEnvironmentEdge testEdge = new ManualEnvironmentEdge(); EnvironmentEdgeManager.injectEdge(testEdge); long limit = Long.MAX_VALUE; // For unconfigured limiters, it is supposed to use as much as possible RateLimiter avgLimiter = new AverageIntervalRateLimiter(); RateLimiter fixLimiter = new FixedIntervalRateLimiter(); assertEquals(limit, avgLimiter.getAvailable()); assertEquals(limit, fixLimiter.getAvailable()); assertTrue(avgLimiter.canExecute(limit)); avgLimiter.consume(limit); assertTrue(fixLimiter.canExecute(limit)); fixLimiter.consume(limit); // Make sure that available is Long.MAX_VALUE assertTrue(limit == avgLimiter.getAvailable()); assertTrue(limit == fixLimiter.getAvailable()); // after 100 millseconds, it should be able to execute limit as well testEdge.incValue(100); assertTrue(avgLimiter.canExecute(limit)); avgLimiter.consume(limit); assertTrue(fixLimiter.canExecute(limit)); fixLimiter.consume(limit); // Make sure that available is Long.MAX_VALUE assertTrue(limit == avgLimiter.getAvailable()); assertTrue(limit == fixLimiter.getAvailable()); EnvironmentEdgeManager.reset(); }
long limit = Long.MAX_VALUE - 1; RateLimiter avgLimiter = new AverageIntervalRateLimiter(); avgLimiter.set(limit, TimeUnit.SECONDS); RateLimiter fixLimiter = new FixedIntervalRateLimiter();