/** * Create the {@link TransmissionPolicyManager} and set the ability to throttle. * @param throttlingIsEnabled Set whether the {@link TransmissionPolicyManager} can be throttled. */ public TransmissionPolicyManager(boolean throttlingIsEnabled) { suspensionDate = null; this.throttlingIsEnabled = throttlingIsEnabled; this.transmissionHandlers = new ArrayList<TransmissionHandler>(); this.backoffManager = new SenderThreadsBackOffManager(new ExponentialBackOffTimesPolicy()); }
public boolean backOffCurrentSenderThread() { SenderThreadLocalBackOffData currentThreadData = this.get(); return currentThreadData.backOff(); }
public SenderThreadsBackOffManager(BackOffTimesPolicy backOffTimesContainer) { allSendersData = new ArrayList<SenderThreadLocalBackOffData>(); initializeBackOffTimeouts(backOffTimesContainer); }
private static void verifyBackOffWithDoneSending(SenderThreadsBackOffManager manager, int backOffTimes, long expectedMilliseconds, Integer doneSendingAfter, boolean... expectedBackOffResult) throws InterruptedException { int limit = backOffTimes + (doneSendingAfter == null ? 0 : 1); int reduce = 0; long start = new Long(System.nanoTime()); for (int i = 0; i < limit; ++i) { if (doneSendingAfter != null && i == doneSendingAfter) { manager.onDoneSending(); reduce = 1; continue; } boolean done = manager.backOffCurrentSenderThread(); assertEquals(done, expectedBackOffResult[i - reduce]); } int elapsed = (int)((double)(System.nanoTime() - start) / 1000000.0); assertTrue(String.format("BackOff lasted %d which is less than expected %d", elapsed, expectedMilliseconds), elapsed >= expectedMilliseconds); assertTrue(String.format("BackOff lasted %d which is more than expected %d", elapsed, expectedMilliseconds), elapsed <= expectedMilliseconds + 2000); }
/** * Clear the current thread state and and reset the back off counter. */ public void clearBackoff() { policyState.setCurrentState(TransmissionPolicy.UNBLOCKED); backoffManager.onDoneSending(); InternalLogger.INSTANCE.info("Backoff has been reset."); }
@Override protected SenderThreadLocalBackOffData initialValue() { int addSeconds = threadsSecondsDifference.incrementAndGet(); senderThreadLocalData = new SenderThreadLocalBackOffData(backOffTimeoutsInMilliseconds, addSeconds * 1000); registerSenderData(senderThreadLocalData); return senderThreadLocalData; }
/** * Suspend the transmission thread according to the current back off policy. */ public void backoff() { policyState.setCurrentState(TransmissionPolicy.BACKOFF); long backOffMillis = backoffManager.backOffCurrentSenderThreadValue(); if (backOffMillis > 0) { long backOffSeconds = backOffMillis / 1000; InternalLogger.INSTANCE.info("App is throttled, telemetry will be blocked for %s seconds.", backOffSeconds); this.suspendInSeconds(TransmissionPolicy.BACKOFF, backOffSeconds); } }
@Override public void run() { try { barrier.await(); measure.start(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } manager.backOffCurrentSenderThread(); } });
manager.stopAllSendersBackOffActivities(); Thread.sleep(1000); expectedMaxMilliseconds += 1000; manager.stopAllSendersBackOffActivities();
private static SenderThreadsBackOffManager createManager(long[] backOffTimeouts) { BackOffTimesPolicy container = Mockito.mock(BackOffTimesPolicy.class); Mockito.doReturn(backOffTimeouts).when(container).getBackOffTimeoutsInMillis(); SenderThreadsBackOffManager manager = new SenderThreadsBackOffManager(container); return manager; }
public long backOffCurrentSenderThreadValue() { SenderThreadLocalBackOffData currentThreadData = this.get(); return currentThreadData.backOffTimerValue(); }
public void onDoneSending() { SenderThreadLocalBackOffData currentThreadData = this.get(); currentThreadData.onDoneSending(); }