@Inject public IngestExecutorService(@Named(PERMIT_COUNT) int permitCount) { m_permitCount = permitCount; //m_congestionTimer = new CongestionTimer(m_permitCount); m_semaphore = new CongestionSemaphore(m_permitCount); m_threadGroup = new ThreadGroup("KairosDynamic"); m_internalExecutor = Executors.newCachedThreadPool(new ThreadFactory() { private int m_count = 0; @Override public Thread newThread(Runnable r) { Thread t = new Thread(m_threadGroup, r,"Ingest worker-"+m_count++); //t.setDaemon(true); return t; } }); m_retryer = RetryerBuilder.<Integer>newBuilder() .retryIfExceptionOfType(NoHostAvailableException.class) .retryIfExceptionOfType(UnavailableException.class) .withWaitStrategy(WaitStrategies.fibonacciWait(1, TimeUnit.MINUTES)) .build(); }
@Test public void testWithMoreThanOneWaitStrategyOneBeingIncremental() throws Exception { Callable<Boolean> callable = notNullAfter5Attempts(); Retryer retryer = RetryerBuilder.newBuilder() .withWaitStrategy(WaitStrategies.join( WaitStrategies.incrementingWait(10L, TimeUnit.MILLISECONDS, 10L, TimeUnit.MILLISECONDS), WaitStrategies.fibonacciWait(10, Long.MAX_VALUE, TimeUnit.MILLISECONDS))) .retryIfResult(Objects::isNull) .build(); long start = System.currentTimeMillis(); boolean result = retryer.call(callable); assertTrue(System.currentTimeMillis() - start >= 270L); assertTrue(result); }
@Test public void testWithMoreThanOneWaitStrategyOneBeingFixed() throws Exception { Callable<Boolean> callable = notNullAfter5Attempts(); Retryer retryer = RetryerBuilder.newBuilder() .withWaitStrategy(WaitStrategies.join( WaitStrategies.fixedWait(50L, TimeUnit.MILLISECONDS), WaitStrategies.fibonacciWait(10, Long.MAX_VALUE, TimeUnit.MILLISECONDS))) .retryIfResult(Objects::isNull) .build(); long start = System.currentTimeMillis(); boolean result = retryer.call(callable); assertTrue(System.currentTimeMillis() - start >= 370L); assertTrue(result); }
@Test public void testFibonacci() { WaitStrategy fibonacciWait = WaitStrategies.fibonacciWait(); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(1, 0L)) == 1L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(2, 0L)) == 1L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(3, 0L)) == 2L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(4, 0L)) == 3L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(5, 0L)) == 5L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(6, 0L)) == 8L); }
@Test public void testFibonacciWithMultiplierAndMaximumWait() { WaitStrategy fibonacciWait = WaitStrategies.fibonacciWait(1000L, 50000L, TimeUnit.MILLISECONDS); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(1, 0L)) == 1000L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(2, 0L)) == 1000L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(3, 0L)) == 2000L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(4, 0L)) == 3000L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(5, 0L)) == 5000L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(6, 0L)) == 8000L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(7, 0L)) == 13000L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(10, 0L)) == 50000L); }
@Test public void testFibonacciWithMaximumWait() { WaitStrategy fibonacciWait = WaitStrategies.fibonacciWait(10L, TimeUnit.MILLISECONDS); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(1, 0L)) == 1L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(2, 0L)) == 1L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(3, 0L)) == 2L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(4, 0L)) == 3L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(5, 0L)) == 5L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(6, 0L)) == 8L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(7, 0L)) == 10L); assertTrue(fibonacciWait.computeSleepTime(failedAttempt(8, 0L)) == 10L); }