use of com.yahoo.search.searchers.RateLimitingSearcher in project vespa by vespa-engine.
the class RateLimitingSearcherTestCase method testRateLimiting.
@Test
public void testRateLimiting() {
RateLimitingConfig.Builder rateLimitingConfig = new RateLimitingConfig.Builder();
rateLimitingConfig.maxAvailableCapacity(4);
rateLimitingConfig.capacityIncrement(2);
rateLimitingConfig.recheckForCapacityProbability(1.0);
ClusterInfoConfig.Builder clusterInfoConfig = new ClusterInfoConfig.Builder();
clusterInfoConfig.clusterId("testCluster");
clusterInfoConfig.nodeCount(4);
ManualClock clock = new ManualClock();
MetricReceiver.MockReceiver metric = new MetricReceiver.MockReceiver();
Chain<Searcher> chain = new Chain<Searcher>("test", new RateLimitingSearcher(new RateLimitingConfig(rateLimitingConfig), new ClusterInfoConfig(clusterInfoConfig), metric, clock), new CostSettingSearcher());
assertEquals("'rate' request are available initially", 2, tryRequests(chain, "id1"));
assertTrue("However, don't reject if we dryRun", executeWasAllowed(chain, "id1", true));
// causes 2 new requests to become available
clock.advance(Duration.ofMillis(1500));
assertEquals("'rate' new requests became available", 2, tryRequests(chain, "id1"));
assertEquals("Another id", 2, tryRequests(chain, "id2"));
clock.advance(Duration.ofMillis(1000000));
assertEquals("'maxAvailableCapacity' request became available", 4, tryRequests(chain, "id2"));
assertFalse("If quota is set to 0, all requests are rejected, even initially", executeWasAllowed(chain, "id3", 0));
clock.advance(Duration.ofMillis(1000000));
assertTrue("A single query which costs more than capacity is allowed as cost is calculated after allowing it", executeWasAllowed(chain, "id1", 8, 8, false));
assertFalse("capacity is -4: disallowing", executeWasAllowed(chain, "id1"));
clock.advance(Duration.ofMillis(1000));
assertFalse("capacity is -2: disallowing", executeWasAllowed(chain, "id1"));
clock.advance(Duration.ofMillis(1000));
assertFalse("capacity is 0: disallowing", executeWasAllowed(chain, "id1"));
clock.advance(Duration.ofMillis(1000));
assertTrue(executeWasAllowed(chain, "id1"));
// check metrics
Map<Point, UntypedMetric> map = metric.getSnapshot().getMapForMetric("requestsOverQuota");
assertEquals(requestsToTry - 2 + 1 + requestsToTry - 2 + 3, map.get(metric.point("id", "id1")).getCount());
assertEquals(requestsToTry - 2 + requestsToTry - 4, map.get(metric.point("id", "id2")).getCount());
}
Aggregations