@Override public void run() { strategy.onTimeout(controller); } });
private boolean isUploadAllowed() { if (timeouts.size() >= strategy.getMaxParallelUploads()) { LOG.debug("Ignore log upload: too much pending requests {}, max allowed {}", timeouts.size(), strategy.getMaxParallelUploads()); return false; } return true; }
protected void scheduleUploadCheck() { LOG.trace("Attempt to execute upload check: {}", uploadCheckInProgress); synchronized (uploadCheckLock) { if (!uploadCheckInProgress) { LOG.trace("Scheduling upload check with timeout: {}", strategy.getUploadCheckPeriod()); uploadCheckInProgress = true; executorContext.getScheduledExecutor().schedule(new Runnable() { @Override public void run() { synchronized (uploadCheckLock) { uploadCheckInProgress = false; } uploadIfNeeded(); } }, strategy.getUploadCheckPeriod(), TimeUnit.SECONDS); } else { LOG.trace("Upload check is already scheduled!"); } } }
protected void uploadIfNeeded() { processUploadDecision(strategy.isUploadNeeded(storage.getStatus())); }
@Override public void run() { strategy.onFailure(controller, errorCode); } });
}, strategy.getTimeout(), TimeUnit.SECONDS);
processUploadDecision(strategy.isUploadNeeded(storage.getStatus()));
@Test public void testTimeout() throws Exception { int timeout = 2; // in seconds KaaChannelManager channelManager = Mockito.mock(KaaChannelManager.class); FailoverManager failoverManager = Mockito.mock(FailoverManager.class); LogTransport transport = Mockito.mock(LogTransport.class); LogDeliveryListener deliveryListener = Mockito.mock(LogDeliveryListener.class); AbstractLogCollector logCollector = new DefaultLogCollector(transport, executorContext, channelManager, failoverManager); DefaultLogUploadStrategy tmp = new DefaultLogUploadStrategy(); tmp.setTimeout(timeout); LogUploadStrategy strategy = Mockito.spy(tmp); logCollector.setLogDeliveryListener(deliveryListener); logCollector.setStrategy(strategy); Log record = new Log(); logCollector.addLogRecord(record); logCollector.addLogRecord(record); logCollector.addLogRecord(record); logCollector.addLogRecord(record); logCollector.addLogRecord(record); logCollector.addLogRecord(record); Mockito.verify(strategy, Mockito.times(0)).onTimeout(Mockito.any(LogFailoverCommand.class)); LogSyncRequest request1 = Mockito.mock(LogSyncRequest.class); logCollector.fillSyncRequest(request1); Thread.sleep(timeout / 2 * 1000); Mockito.verify(strategy, Mockito.times(0)).onTimeout(Mockito.any(LogFailoverCommand.class)); Thread.sleep(timeout / 2 * 1000); logCollector.addLogRecord(record); verify(deliveryListener, Mockito.timeout(1000)).onLogDeliveryTimeout(Mockito.any(BucketInfo.class)); Mockito.verify(strategy, Mockito.timeout(1000).times(1)).onTimeout(Mockito.any(LogFailoverCommand.class)); }
private void processUploadDecision(LogUploadStrategyDecision decision) { switch (decision) { case UPLOAD: if (isUploadAllowed()) { LOG.debug("Going to upload logs"); transport.sync(); } break; case NOOP: if (strategy.getUploadCheckPeriod() > 0 && storage.getStatus().getRecordCount() > 0) { scheduleUploadCheck(); } break; default: break; } }