downloadedEvent.await(getMillisLeft()); downloadAndCommitSubItemsOf(item); cache.update(itemId, getResult()); emergencyBreak(); return; addItemToResync(item.getId(),record); } else { cache.update(itemId, getResult()); notifyContractSubscribers(item, getState()); startResync(); return; report(getLabel(), () -> concatReportMessage("timeout ", itemId, " from parcel: ", parcelId, " :: downloadAndCommit timeoutException, state ", processingState, " itemState: ", getState()), DatagramAdapter.VerboseLevel.NOTHING); e.printStackTrace(); setState(ItemState.UNDEFINED); try { itemLock.synchronize(record.getId(), lock -> { close();
itemId, " from parcel: ", parcelId, " :: vote " + state + " from " + node + ", state ", processingState, " :: itemState ", getState()), DatagramAdapter.VerboseLevel.BASE); boolean positiveConsensus = false; close(); approveAndCommit(); } else if (negativeConsensus) { rollbackChanges(ItemState.DECLINED); } else throw new RuntimeException("error: consensus reported without consensus");
private final void itemDownloaded() { report(getLabel(), () -> concatReportMessage("item processor for item: ", itemId, " from parcel: ", parcelId, " :: itemDownloaded, state ", processingState, " itemState: ", getState()), DatagramAdapter.VerboseLevel.BASE); if(processingState.canContinue()) { synchronized (cache) { cache.put(item, getResult()); } synchronized (mutex) { //save item in disk cache ledger.putItem(record, item, Instant.now().plus(config.getMaxDiskCacheAge())); } if(item instanceof Contract) { if(((Contract)item).isLimitedForTestnet()) { markContractTest((Contract) item); } } if(!processingState.isProcessedToConsensus()) { processingState = ItemProcessingState.DOWNLOADED; } if(isCheckingForce) { checkItem(); } downloadedEvent.fire(); } }
ItemProcessor revokingProcessor = processors.get(revokingItem.getId()); if (revokingProcessor != null) revokingProcessor.forceRemoveSelf(); if(!searchNewItemWithParent(item,revokingItem.getId())) { ((NSmartContract) revokingItem).setNodeInfoProvider(nodeInfoProvider); NImmutableEnvironment ime = getEnvironment((NSmartContract)revokingItem); notifyContractSubscribers(revokingItem, r.getState()); emergencyBreak(); return null; addItemToResync(itemId,record); } else { notifyContractSubscribers(newItem, r.getState()); emergencyBreak(); return null; downloadAndCommitSubItemsOf(newItem);
"nothing found, will create item processor"), DatagramAdapter.VerboseLevel.BASE); ItemProcessor processor = new ItemProcessor(itemId, parcelId, item, lock, forceChecking); processors.put(itemId, processor); return processor;
private final synchronized void checkItem() { report(getLabel(), () -> concatReportMessage("item processor for item: ", itemId, " from parcel: ", parcelId, " :: checkItem, state ", processingState, " itemState: ", getState()), DatagramAdapter.VerboseLevel.BASE); if(processingState.canContinue()) { itemsToResync = isNeedToResync(true); needToResync = !itemsToResync.isEmpty(); checkSubItems(); item.addError(Errors.FAILURE, item.getId().toString(), "Not enough payment for process item (quantas limit)"); emergencyBreak(); return; } catch (Exception e) { commitCheckedAndStartPolling(); } else { for (HashId hid : itemsToResync.keySet()) { addItemToResync(hid, itemsToResync.get(hid)); startResync();
private final void commitCheckedAndStartPolling() { report(getLabel(), () -> concatReportMessage("item processor for item: ", itemId, " from parcel: ", parcelId, " :: commitCheckedAndStartPolling, state ", processingState, " itemState: ", getState()), DatagramAdapter.VerboseLevel.BASE); if(processingState.canContinue()) { if (record.getState() == ItemState.PENDING) { if (checkPassed) { setState(ItemState.PENDING_POSITIVE); } else { setState(ItemState.PENDING_NEGATIVE); cache.update(itemId, getResult()); emergencyBreak(); emergencyBreak(); return; vote(myInfo, record.getState()); broadcastMyState(); pulseStartPolling(); pollingReadyEvent.fire();
private void close() { report(getLabel(), () -> concatReportMessage("item processor for item: ", itemId, " from parcel: ", parcelId, " :: close, state ", processingState, " itemState: ", getState()), DatagramAdapter.VerboseLevel.BASE); if(processingState.canContinue()) processingState = ItemProcessingState.DONE; stopPoller(); // fire all event to release possible listeners downloadedEvent.fire(); pollingReadyEvent.fire(); doneEvent.fire(); if(processingState.canContinue()) { checkIfAllReceivedConsensus(); if (processingState == ItemProcessingState.DONE) { pulseSendNewConsensus(); } else { removeSelf(); } } else { removeSelf(); } }
/** * Start checking if item was downloaded and wait for isCheckingForce flag. * If item hasn't downloaded just set isCheckingForce for true. * @param isCheckingForce */ private void forceChecking(boolean isCheckingForce) { report(getLabel(), () -> concatReportMessage("item processor for item: ", itemId, " from parcel: ", parcelId, " :: forceChecking, state ", processingState, " itemState: ", getState()), DatagramAdapter.VerboseLevel.BASE); this.isCheckingForce = isCheckingForce; if(processingState.canContinue()) { if (processingState == ItemProcessingState.DOWNLOADED) { executorService.submit(() -> { checkItem(); }, Node.this.toString() + toString() + " :: forceChecking -> checkItem"); } } }
private final synchronized void checkSubItemsOf(Approvable checkingItem) { if(processingState.canContinue()) { if (!processingState.isProcessedToConsensus()) { // check referenced items //checkReferencesOf(checkingItem); // check revoking items checkRevokesOf(checkingItem); // check new items checkNewsOf(checkingItem); } } }
private final void checkSubItems() { if(processingState.canContinue()) { if (!processingState.isProcessedToConsensus()) { checkSubItemsOf(item); } } }
private final void onAllResyncItemsFinished() { processingState = ItemProcessingState.CHECKING; try { checkSubItems(); } catch (Exception e) { e.printStackTrace(); report(getLabel(), ()->"error: ItemProcessor.onAllResyncItemsFinished() exception: " + e, DatagramAdapter.VerboseLevel.BASE); } commitCheckedAndStartPolling(); }