public void restart() { waitsCount = 0; if (future != null) future.cancel(true); run(); }
private void stopConsensusReceivedChecker() { if(consensusReceivedChecker != null) consensusReceivedChecker.cancel(true); }
public void restartResync() { obtainedAnswersFromNodes.clear(); resyncer.restart(); }
@Test public void testCancel() throws Exception { executorService.submit(() -> System.out.println("warm up executor")); Thread.sleep(1000); List<Integer> periods = Arrays.asList(100,100,100,200); time = System.nanoTime(); AtomicInteger iTick = new AtomicInteger(0); AtomicInteger errorsCount = new AtomicInteger(0); RunnableWithDynamicPeriod r = new RunnableWithDynamicPeriod(() -> { long t1 = System.nanoTime(); long dt = (t1 - time) / 1000000; time = t1; long dt0 = periods.get(Math.min(iTick.get(), periods.size()-1)); System.out.println("tick: " + dt + "ms, must be " + dt0 + "ms"); if (!(Math.abs(dt0 - dt) < dt0/10)) errorsCount.incrementAndGet(); iTick.incrementAndGet(); }, periods, executorService); r.run(); System.out.println("wait for ticks"); Thread.sleep(2000); AtomicInteger ticksCount = new AtomicInteger(iTick.get()); System.out.println("now cancel"); r.cancel(true); Thread.sleep(2000); Assert.assertEquals(ticksCount.get(), iTick.get()); }
AtomicInteger errorsCount = new AtomicInteger(0); RunnableWithDynamicPeriod r = new RunnableWithDynamicPeriod(() -> { long t1 = System.nanoTime(); long dt = (t1 - time) / 1000000; iTick.incrementAndGet(); }, periods, executorService); r.run(); r.restart(); iTick.set(0); time = System.nanoTime(); System.out.println("executorService.size: " + executorService.getQueue().size()); Assert.assertEquals(1, executorService.getQueue().size()); r.cancel(true); while (executorService.getQueue().size() > 0) { Thread.sleep(1000);
public void startResync() { report(getLabel(), ()->"ResyncProcessor.startResync(itemId="+itemId+")", DatagramAdapter.VerboseLevel.BASE); resyncExpiresAt = Instant.now().plus(config.getMaxResyncTime()); executorService.schedule(()->resyncEnded(), config.getMaxResyncTime().getSeconds(), TimeUnit.SECONDS); resyncingItem = new ResyncingItem(itemId, ledger.getRecord(itemId)); resyncingItem.finishEvent.addConsumer((ri)->onFinishResync(ri)); List<Integer> periodsMillis = config.getResyncTime(); obtainedAnswersFromNodes.clear(); voteItself(); resyncer = new RunnableWithDynamicPeriod(() -> pulseResync(), periodsMillis, executorService); resyncer.run(); }
@Test public void testPeriods() throws Exception { executorService.submit(() -> System.out.println("warm up executor")); Thread.sleep(1000); List<Integer> periods = Arrays.asList(0,100,100,100,200,400,800,1600,3200,6000); time = System.nanoTime(); AtomicInteger iTick = new AtomicInteger(0); AtomicInteger errorsCount = new AtomicInteger(0); RunnableWithDynamicPeriod r = new RunnableWithDynamicPeriod(() -> { long t1 = System.nanoTime(); long dt = (t1 - time) / 1000000; time = t1; long dt0 = periods.get(Math.min(iTick.get(), periods.size()-1)); System.out.println("tick: " + dt + "ms, must be " + dt0 + "ms"); if (!(Math.abs(dt0 - dt) < 5+dt0/10)) errorsCount.incrementAndGet(); iTick.incrementAndGet(); }, periods, executorService); r.run(); Thread.sleep(30000); System.out.println("executorService.size: " + executorService.getQueue().size()); Assert.assertEquals(1, executorService.getQueue().size()); r.cancel(true); Thread.sleep(1000); System.out.println("executorService.size: " + executorService.getQueue().size()); Assert.assertEquals(0, executorService.getQueue().size()); Assert.assertEquals(0, errorsCount.get()); }
private final void pulseSendNewConsensus() { report(getLabel(), () -> concatReportMessage("item processor for item: ", itemId, " from parcel: ", parcelId, " :: pulseSendNewConsensus, state ", processingState, " itemState: ", getState()), DatagramAdapter.VerboseLevel.BASE); if(processingState.canContinue()) { processingState = ItemProcessingState.SENDING_CONSENSUS; synchronized (mutex) { if(consensusReceivedChecker == null) { List<Integer> periodsMillis = config.getConsensusReceivedCheckTime(); consensusReceivedChecker = new RunnableWithDynamicPeriod(() -> sendNewConsensusNotification(), periodsMillis, executorService ); consensusReceivedChecker.run(); } } } }
private final void pulseStartPolling() { report(getLabel(), () -> concatReportMessage("item processor for item: ", itemId, " from parcel: ", parcelId, " :: pulseStartPolling, state ", processingState, " itemState: ", getState()), DatagramAdapter.VerboseLevel.BASE); if(processingState.canContinue()) { if (!processingState.isProcessedToConsensus()) { // at this point the item is with us, so we can start synchronized (mutex) { if (!processingState.isProcessedToConsensus()) { if (poller == null) { List<Integer> pollTimes = config.getPollTime(); poller = new RunnableWithDynamicPeriod(() -> sendStartPollingNotification(), pollTimes, executorService ); poller.run(); } } } } } }
private void stopPoller() { if (poller != null) poller.cancel(true); }
private void stopResync() { resyncer.cancel(true); resyncProcessors.remove(itemId); }
public void pulseResync() { report(getLabel(), ()->"ResyncProcessor.pulseResync(itemId="+itemId+ "), time="+Duration.between(resyncExpiresAt.minus(config.getMaxResyncTime()), Instant.now()).toMillis()+"ms", DatagramAdapter.VerboseLevel.BASE); if (resyncExpiresAt.isBefore(Instant.now())) { report(getLabel(), ()->"ResyncProcessor.pulseResync(itemId="+itemId+") expired, cancel", DatagramAdapter.VerboseLevel.BASE); resyncer.cancel(true); } else { try { ResyncNotification notification = new ResyncNotification(myInfo, itemId, true); network.eachNode(node -> { if (!obtainedAnswersFromNodes.contains(node)) network.deliver(node, notification); }); } catch (IOException e) { report(getLabel(), ()->"error: unable to send ResyncNotification, exception: " + e, DatagramAdapter.VerboseLevel.BASE); } } }
public void obtainAnswer(ResyncNotification answer) { if (obtainedAnswersFromNodes.putIfAbsent(answer.getFrom(), 0) == null) { report(getLabel(), () -> "ResyncProcessor.obtainAnswer(itemId=" + itemId + "), state: " + answer.getItemState(), DatagramAdapter.VerboseLevel.BASE); resyncingItem.resyncVote(answer.getFrom(), answer.getItemState()); if (answer.getHasEnvironment()) envSources.put(answer.getFrom(), 0); if (resyncingItem.isResyncPollingFinished() && resyncingItem.isCommitFinished()) { report(getLabel(), () -> "ResyncProcessor.obtainAnswer... resync done", DatagramAdapter.VerboseLevel.BASE); resyncer.cancel(true); } } }
private void onFinishResync(ResyncingItem ri) { report(getLabel(), ()->"ResyncProcessor.onFinishResync(itemId="+itemId+")", DatagramAdapter.VerboseLevel.BASE); //DELETE ENVIRONMENTS FOR REVOKED ITEMS if(resyncingItem.getResyncingState() == ResyncingItemProcessingState.COMMIT_SUCCESSFUL) { if(resyncingItem.getItemState() == ItemState.REVOKED) { removeEnvironment(itemId); } } //SAVE ENVIRONMENTS FOR APPROVED ITEMS if (saveResyncedEnvironents()) { resyncEnded(); } else { resyncer.cancel(true); } }