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(); }
private final void onResyncItemFinished(ResyncingItem ri) { if(processingState.canContinue()) { if (!processingState.isProcessedToConsensus()) { resyncingItemsResults.put(ri.hashId, ri.getItemState()); if (resyncingItemsResults.size() >= resyncingItems.size()) { onAllResyncItemsFinished(); } } } }
private void resyncEnded() { if (resyncingItem.getResyncingState() == ResyncingItemProcessingState.COMMIT_FAILED) { //TODO: how to call this from ResyncProcessor? //rollbackChanges(stateWas); executorService.schedule(() -> itemSanitationFailed(resyncingItem.record), 0, TimeUnit.SECONDS); } else { executorService.schedule(() -> itemSanitationDone(resyncingItem.record), 0, TimeUnit.SECONDS); } finishEvent.fire(resyncingItem); stopResync(); }
if (isResyncPollingFinished()) { return; resyncingState = ResyncingItemProcessingState.PENDING_TO_COMMIT; if (!isResyncPollingFinished()) return; executorService.submit(() -> resyncAndCommit(ItemState.REVOKED), Node.this.toString() + " > item " + hashId + " :: resyncVote -> resyncAndCommit"); } else if (declinedConsenus) { executorService.submit(() -> resyncAndCommit(ItemState.DECLINED), Node.this.toString() + " > item " + hashId + " :: resyncVote -> resyncAndCommit"); } else if (approvedConsenus) { executorService.submit(() -> resyncAndCommit(ItemState.APPROVED), Node.this.toString() + " > item " + hashId + " :: resyncVote -> resyncAndCommit"); } else if (undefinedConsenus) { executorService.submit(() -> resyncAndCommit(ItemState.UNDEFINED),
/** * Emergency break all processes and remove self. */ private void emergencyBreak() { report(getLabel(), () -> concatReportMessage("item processor for item: ", itemId, " from parcel: ", parcelId, " :: emergencyBreak, state ", processingState, " itemState: ", getState()), DatagramAdapter.VerboseLevel.BASE); boolean doRollback = !processingState.isDone(); processingState = ItemProcessingState.EMERGENCY_BREAK; stopDownloader(); stopPoller(); stopConsensusReceivedChecker(); for(ResyncingItem ri : resyncingItems.values()) { if(!ri.isCommitFinished()) { ri.closeByTimeout(); } } if(doRollback) rollbackChanges(stateWas); else close(); processingState = ItemProcessingState.FINISHED; }
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); } }
private void voteItself() { if (resyncingItem.getItemState().isConsensusFound()) resyncingItem.resyncVote(myInfo, resyncingItem.getItemState()); else resyncingItem.resyncVote(myInfo, ItemState.UNDEFINED); }
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 onResyncSubTreeItemFinish(ResyncingItem ri) { resyncingSubTreeItemsResults.put(ri.hashId, ri.getItemState()); if (resyncingSubTreeItemsResults.size() >= resyncingSubTreeItems.size()) { resyncEnded(); } }
public void addItemToResync(HashId hid, StateRecord record) { if(processingState.canContinue()) { resyncingItems.putIfAbsent(hid, new ResyncingItem(hid, record)); } }