FlowControlSettings.newBuilder() .setMaxOutstandingElementCount(100000L) .setMaxOutstandingRequestBytes(10485760L) .setLimitExceededBehavior(LimitExceededBehavior.ThrowException) .build())
FlowControlSettings.newBuilder() .setMaxOutstandingElementCount(100000L) .setMaxOutstandingRequestBytes(10485760L) .setLimitExceededBehavior(LimitExceededBehavior.ThrowException) .build())
.setLimitExceededBehavior(LimitExceededBehavior.Block) .setMaxOutstandingElementCount(10L) .setMaxOutstandingRequestBytes(10L) .build()) .build();
private static BatchingFlowController<SimpleBatch> getTrackedIntegerBatchingFlowController( Long elementCount, Long byteCount, LimitExceededBehavior limitExceededBehaviour) { trackedFlowController = new TrackedFlowController( FlowControlSettings.newBuilder() .setMaxOutstandingElementCount(elementCount) .setMaxOutstandingRequestBytes(byteCount) .setLimitExceededBehavior(limitExceededBehaviour) .build()); return new BatchingFlowController<>( trackedFlowController, new ElementCounter<SimpleBatch>() { @Override public long count(SimpleBatch t) { return t.getIntegers().size(); } }, new ElementCounter<SimpleBatch>() { @Override public long count(SimpleBatch t) { long counter = 0; for (Integer i : t.integers) { counter += i; } return counter; } }); }
@Test public void testInvalidArguments() throws Exception { FlowController flowController = new FlowController( FlowControlSettings.newBuilder() .setMaxOutstandingElementCount(10L) .setMaxOutstandingRequestBytes(10L) .setLimitExceededBehavior(LimitExceededBehavior.Block) .build()); flowController.reserve(0, 0); try { flowController.reserve(-1, 1); fail("Must have thrown an illegal argument error"); } catch (IllegalArgumentException expected) { // Expected } try { flowController.reserve(1, -1); fail("Must have thrown an illegal argument error"); } catch (IllegalArgumentException expected) { // Expected } }
@Test public void testRestoreAfterFail() throws FlowController.FlowControlException { FlowController flowController = new FlowController( FlowControlSettings.newBuilder() .setMaxOutstandingElementCount(2L) .setMaxOutstandingRequestBytes(1L) .setLimitExceededBehavior(LimitExceededBehavior.ThrowException) .build()); flowController.reserve(1, 1); try { flowController.reserve(1, 1); throw new IllegalStateException("flowController should not have any bytes left"); } catch (FlowController.MaxOutstandingRequestBytesReachedException e) { // Ignore. } flowController.reserve(1, 0); }
@Test public void testReserveRelease_rejectedByElementCount() throws Exception { FlowController flowController = new FlowController( FlowControlSettings.newBuilder() .setMaxOutstandingElementCount(10L) .setMaxOutstandingRequestBytes(100L) .setLimitExceededBehavior(LimitExceededBehavior.ThrowException) .build()); testRejectedReserveRelease( flowController, 10, 10, FlowController.MaxOutstandingElementCountReachedException.class); }
@Test public void testReserveRelease_blockedByNumberOfBytes_noElementCountLimit() throws Exception { FlowController flowController = new FlowController( FlowControlSettings.newBuilder() .setMaxOutstandingRequestBytes(10L) .setLimitExceededBehavior(LimitExceededBehavior.Block) .build()); testBlockingReserveRelease(flowController, 10, 10); }
@Test public void testReserveRelease_blockedByNumberOfBytes() throws Exception { FlowController flowController = new FlowController( FlowControlSettings.newBuilder() .setMaxOutstandingElementCount(100L) .setMaxOutstandingRequestBytes(10L) .setLimitExceededBehavior(LimitExceededBehavior.Block) .build()); testBlockingReserveRelease(flowController, 10, 10); }
@Test public void testReserveRelease_blockedByElementCount() throws Exception { FlowController flowController = new FlowController( FlowControlSettings.newBuilder() .setMaxOutstandingElementCount(10L) .setMaxOutstandingRequestBytes(100L) .setLimitExceededBehavior(LimitExceededBehavior.Block) .build()); testBlockingReserveRelease(flowController, 10, 10); }
@Test public void testReserveRelease_ignore_ok() throws Exception { FlowController flowController = new FlowController( FlowControlSettings.newBuilder() .setMaxOutstandingElementCount(1L) .setMaxOutstandingRequestBytes(1L) .setLimitExceededBehavior(LimitExceededBehavior.Ignore) .build()); flowController.reserve(1, 1); flowController.release(1, 1); }
@Test public void testReserveRelease_ok() throws Exception { FlowController flowController = new FlowController( FlowControlSettings.newBuilder() .setMaxOutstandingElementCount(10L) .setMaxOutstandingRequestBytes(10L) .setLimitExceededBehavior(LimitExceededBehavior.Block) .build()); flowController.reserve(1, 1); flowController.release(1, 1); }
@Test public void testReserveRelease_rejectedByNumberOfBytes() throws Exception { FlowController flowController = new FlowController( FlowControlSettings.newBuilder() .setMaxOutstandingElementCount(100L) .setMaxOutstandingRequestBytes(10L) .setLimitExceededBehavior(LimitExceededBehavior.ThrowException) .build()); testRejectedReserveRelease( flowController, 10, 10, FlowController.MaxOutstandingRequestBytesReachedException.class); }
@Test public void testReserveRelease_rejectedByNumberOfBytes_noElementCountLimit() throws Exception { FlowController flowController = new FlowController( FlowControlSettings.newBuilder() .setMaxOutstandingRequestBytes(10L) .setLimitExceededBehavior(LimitExceededBehavior.ThrowException) .build()); testRejectedReserveRelease( flowController, 10, 10, FlowController.MaxOutstandingRequestBytesReachedException.class); }