if (incrementCompletedNodes() >= consensus) { if (state == CallbackService.FollowerCallbackState.STARTED) complete(node); else if (state == CallbackService.FollowerCallbackState.EXPIRED) spent(node); if (incrementFailedNodes() >= consensus) { if (state == CallbackService.FollowerCallbackState.STARTED) fail(node); incrementOtherNodes();
private synchronized void endSynchronizeFollowerCallbacks() { for (CallbackRecord record: callbacksToSynchronize.values()) { if (record.endSynchronize(ledger, node)) callbacksToSynchronize.remove(record.getId()); } }
private synchronized void startSynchronizeFollowerCallbacks(Collection<CallbackRecord> callbackRecords, int nodesCount) { ZonedDateTime expiresAt = ZonedDateTime.now().plusSeconds(20); callbackRecords.forEach(r -> { if (!callbacksToSynchronize.containsKey(r.getId())) { // init record to synchronization r.setExpiresAt(expiresAt); r.setConsensusAndLimit(nodesCount); callbacksToSynchronize.put(r.getId(), r); // request callback state from all nodes network.broadcast(myInfo, new CallbackNotification(myInfo, r.getId(), CallbackNotification.CallbackNotificationType.GET_STATE, null)); } }); executorService.schedule(() -> endSynchronizeFollowerCallbacks(), 20, TimeUnit.SECONDS); }
assertEquals(callbacks.size(), 2); Iterator<CallbackRecord> it = callbacks.iterator(); assertEquals(it.next().getState(), CallbackService.FollowerCallbackState.EXPIRED); assertEquals(it.next().getState(), CallbackService.FollowerCallbackState.EXPIRED); assertEquals(callbacks.size(), 2); Iterator<CallbackRecord> it = callbacks.iterator(); assertEquals(it.next().getState(), CallbackService.FollowerCallbackState.EXPIRED); assertEquals(it.next().getState(), CallbackService.FollowerCallbackState.EXPIRED); assertEquals(it.next().getState(), CallbackService.FollowerCallbackState.STARTED); assertEquals(it.next().getState(), CallbackService.FollowerCallbackState.STARTED); } else { assertEquals(it.next().getState(), CallbackService.FollowerCallbackState.EXPIRED); assertEquals(it.next().getState(), CallbackService.FollowerCallbackState.EXPIRED);
List<CallbackRecord> res = new ArrayList<>(); while (rs.next()) { CallbackRecord callback = new CallbackRecord( HashId.withDigest(rs.getBytes(1)), rs.getLong(3),
/** * Runs callback processor for one callback. Adds callback record to ledger, runs callback processing thread and * checks and obtains deferred callback notifications. * * @param updatingItem is new revision of following contract * @param contract is follower contract * @param me is environment */ public void startCallbackProcessor(Contract updatingItem, ItemState state, NSmartContract contract, NMutableEnvironment me) { // initialize callback processor CallbackProcessor callback = new CallbackProcessor(updatingItem, state, contract, me.getId(), this); // add callback record to DB CallbackRecord.addCallbackRecordToLedger(callback.getId(), me.getId(), config, network.getNodesCount(), ledger); // run callback processor int startDelay = callback.getDelay(); int repeatDelay = (int) config.getFollowerCallbackDelay().toMillis() * (network.getNodesCount() + 2); callback.setExecutor(executorService.scheduleWithFixedDelay(() -> callback.call(), startDelay, repeatDelay, TimeUnit.MILLISECONDS)); synchronized (callbackProcessors) { callbackProcessors.put(callback.getId(), callback); node.report(DatagramAdapter.VerboseLevel.DETAILED, "notifyFollowerSubscribers: put callback ", callback.getId().toBase64String()); CallbackNotification deferredNotification = deferredCallbackNotifications.get(callback.getId()); if (deferredNotification != null) { // do deferred notification callback.obtainNotification(deferredNotification); deferredCallbackNotifications.remove(callback.getId()); node.report(DatagramAdapter.VerboseLevel.DETAILED, "notifyFollowerSubscribers: remove deferred notification for callback ", callback.getId().toBase64String()); } } }
assertEquals(callbacks.size(), 2); Iterator<CallbackRecord> it = callbacks.iterator(); assertEquals(it.next().getState(), CallbackService.FollowerCallbackState.STARTED); assertEquals(it.next().getState(), CallbackService.FollowerCallbackState.STARTED); } else assertTrue(networkNode.node.getLedger().getFollowerCallbacksToResyncByEnvId(envId).isEmpty()); assertEquals(callbacks.size(), 2); Iterator<CallbackRecord> it = callbacks.iterator(); assertEquals(it.next().getState(), CallbackService.FollowerCallbackState.STARTED); assertEquals(it.next().getState(), CallbackService.FollowerCallbackState.STARTED); } else assertTrue(networkNode.node.getLedger().getFollowerCallbacksToResyncByEnvId(envId).isEmpty()); assertEquals(callbacks.size(), 2); Iterator<CallbackRecord> it = callbacks.iterator(); assertEquals(it.next().getState(), CallbackService.FollowerCallbackState.STARTED); assertEquals(it.next().getState(), CallbackService.FollowerCallbackState.STARTED); } else assertTrue(networkNode.node.getLedger().getFollowerCallbacksToResyncByEnvId(envId).isEmpty());
List<CallbackRecord> res = new ArrayList<>(); while (rs.next()) { CallbackRecord callback = new CallbackRecord( HashId.withDigest(rs.getBytes(1)), environmentId,