def __init__(self, ledger_id: int, config: object, input: RxChannel,
                 output: TxChannel, timer: TimerService,
                 metrics: MetricsCollector, provider: CatchupDataProvider):
        self._ledger_id = ledger_id
        self._ledger = provider.ledger(ledger_id)
        self._config = config
        self._output = output
        self._timer = timer
        self.metrics = metrics
        self._provider = provider

        self._state = LedgerState.not_synced  # TODO: Improve enum
        self._catchup_till = None  # type: Optional[CatchupTill]
        self._num_txns_caught_up = 0

        services_tx, services_rx = create_direct_channel()
        router = Router(services_rx)
        router.add(LedgerCatchupStart, self._on_catchup_start)
        router.add(LedgerCatchupComplete, self._on_catchup_complete)

        self._cons_proof_service = ConsProofService(ledger_id=ledger_id,
                                                    config=config,
                                                    input=input,
                                                    output=services_tx,
                                                    timer=self._timer,
                                                    metrics=self.metrics,
                                                    provider=self._provider)

        self._catchup_rep_service = CatchupRepService(ledger_id=ledger_id,
                                                      config=config,
                                                      input=input,
                                                      output=services_tx,
                                                      timer=self._timer,
                                                      metrics=self.metrics,
                                                      provider=self._provider)
Пример #2
0
    def __init__(self, ledger_id: int, config: object, input: RxChannel,
                 output: TxChannel, timer: TimerService,
                 metrics: MetricsCollector, provider: CatchupDataProvider):
        router = Router(input)
        router.add(LedgerStatus, self.process_ledger_status)
        router.add(ConsistencyProof, self.process_consistency_proof)

        self._ledger_id = ledger_id
        self._ledger = provider.ledger(ledger_id)
        self._config = config
        self._output = output
        self._timer = timer
        self.metrics = metrics
        self._provider = provider
        self._is_working = False

        self._quorum = Quorums(len(self._provider.all_nodes_names()))
        self._same_ledger_status = set()
        self._cons_proofs = {}
        self._already_asked_for_cons_proofs_without_timeout = False
        self._last_txn_3PC_key = {}
        self._ledger_status_timer = \
            RepeatingTimer(self._timer,
                           self._config.LedgerStatusTimeout * (len(self._provider.all_nodes_names()) - 1),
                           self._reask_for_ledger_status,
                           active=False)
        self._consistency_proof_timer = \
            RepeatingTimer(self._timer,
                           self._config.ConsistencyProofsTimeout * (len(self._provider.all_nodes_names()) - 1),
                           self._reask_for_last_consistency_proof,
                           active=False)
Пример #3
0
def patched_node(txnPoolNodeSet):
    node = txnPoolNodeSet[0]

    node_leecher = node.ledgerManager._node_leecher
    router = Router(node_leecher._leecher_outbox_rx)

    def patched_ledger_catchup_complete(msg):
        node_leecher._output.put_nowait(NodeCatchupComplete())

    router.add(LedgerCatchupComplete, patched_ledger_catchup_complete)

    return node
Пример #4
0
    def __init__(self,
                 owner,
                 postAllLedgersCaughtUp: Optional[Callable] = None,
                 preCatchupClbk: Optional[Callable] = None,
                 postCatchupClbk: Optional[Callable] = None,
                 ledger_sync_order: Optional[List] = None,
                 metrics: MetricsCollector = NullMetricsCollector()):
        # If ledger_sync_order is not provided (is None), it is assumed that
        # `postCatchupCompleteClbk` of the LedgerInfo will be used
        self.owner = owner
        self._timer = owner.timer
        self.postAllLedgersCaughtUp = postAllLedgersCaughtUp
        self.preCatchupClbk = preCatchupClbk
        self.postCatchupClbk = postCatchupClbk
        self.ledger_sync_order = ledger_sync_order
        self.request_ledger_status_action_ids = dict()
        self.request_consistency_proof_action_ids = dict()
        self.metrics = metrics

        self._provider = CatchupNodeDataProvider(owner)

        self._client_seeder_inbox, rx = create_direct_channel()
        self._client_seeder = ClientSeederService(rx, self._provider)

        self._node_seeder_inbox, rx = create_direct_channel()
        self._node_seeder = NodeSeederService(rx, self._provider)

        self._leecher_outbox, rx = create_direct_channel()
        router = Router(rx)
        router.add(LedgerCatchupComplete, self._on_catchup_rep_service_stop)
        router.add(ConsProofReady, self._on_cons_proof_service_stop)

        self.config = getConfig()

        # Holds ledgers of different types with
        # their info like callbacks, state, etc
        self.ledgerRegistry = {}  # type: Dict[int, LedgerInfo]

        self._leechers = {
        }  # type: Dict[int, LedgerManager.LedgerLeecherService]

        # Largest 3 phase key received during catchup.
        # This field is needed to discard any stashed 3PC messages or
        # ordered messages since the transactions part of those messages
        # will be applied when they are received through the catchup process
        self.last_caught_up_3PC = (0, 0)

        # Nodes are added in this set when the current node sent a CatchupReq
        # for them and waits a CatchupRep message.
        self.wait_catchup_rep_from = set()
Пример #5
0
    def __init__(self, ledger_id: int, config: object, input: RxChannel,
                 output: TxChannel, timer: TimerService,
                 metrics: MetricsCollector, provider: CatchupDataProvider):
        router = Router(input)
        router.add(LedgerStatus, self.process_ledger_status)
        router.add(ConsistencyProof, self.process_consistency_proof)

        self._ledger_id = ledger_id
        self._ledger = provider.ledger(ledger_id)
        self._config = config
        self._output = output
        self._timer = timer
        self.metrics = metrics
        self._provider = provider
        self._is_working = False

        self._quorum = Quorums(len(self._provider.all_nodes_names()))
        self._same_ledger_status = set()
        self._cons_proofs = {}
        self._requested_consistency_proof = set()
        self._last_txn_3PC_key = {}
    def __init__(self, config: object, input: RxChannel, output: TxChannel,
                 timer: TimerService, metrics: MetricsCollector,
                 provider: CatchupDataProvider):
        self._config = config
        self._input = input
        self._output = output
        self._timer = timer
        self.metrics = metrics
        self._provider = provider

        self._state = self.State.Idle
        self._catchup_till = {}  # type: Dict[int, CatchupTill]
        self._nodes_ledger_sizes = {}  # type: Dict[int, Dict[str, int]]

        # TODO: Get rid of this, theoretically most ledgers can be synced in parallel
        self._current_ledger = None  # type: Optional[int]

        self._leecher_outbox, self._leecher_outbox_rx = create_direct_channel()
        self._leecher_outbox_rx.subscribe(lambda msg: output.put_nowait(msg))
        router = Router(self._leecher_outbox_rx)
        router.add(LedgerCatchupStart, self._on_ledger_catchup_start)
        router.add(LedgerCatchupComplete, self._on_ledger_catchup_complete)

        self._leechers = {}  # type: Dict[int, LedgerLeecherService]
Пример #7
0
    def __init__(self,
                 owner,
                 postAllLedgersCaughtUp: Optional[Callable] = None,
                 preCatchupClbk: Optional[Callable] = None,
                 postCatchupClbk: Optional[Callable] = None,
                 ledger_sync_order: Optional[List] = None,
                 metrics: MetricsCollector = NullMetricsCollector()):
        # If ledger_sync_order is not provided (is None), it is assumed that
        # `postCatchupCompleteClbk` of the LedgerInfo will be used
        self.owner = owner
        self._timer = owner.timer
        self.postAllLedgersCaughtUp = postAllLedgersCaughtUp
        self.preCatchupClbk = preCatchupClbk
        self.postCatchupClbk = postCatchupClbk
        self.ledger_sync_order = ledger_sync_order
        self.request_ledger_status_action_ids = dict()
        self.request_consistency_proof_action_ids = dict()
        self.metrics = metrics

        config = getConfig()
        provider = CatchupNodeDataProvider(owner)

        self._client_seeder_inbox, rx = create_direct_channel()
        self._client_seeder = ClientSeederService(rx, provider)

        self._node_seeder_inbox, rx = create_direct_channel()
        self._node_seeder = NodeSeederService(rx, provider)

        leecher_outbox_tx, leecher_outbox_rx = create_direct_channel()
        router = Router(leecher_outbox_rx)
        router.add(LedgerCatchupStart, self._on_ledger_sync_start)
        router.add(LedgerCatchupComplete, self._on_ledger_sync_complete)
        router.add(NodeCatchupComplete, self._on_catchup_complete)

        self._node_leecher_inbox, rx = create_direct_channel()
        self._node_leecher = NodeLeecherService(config=config,
                                                input=rx,
                                                output=leecher_outbox_tx,
                                                timer=self._timer,
                                                metrics=self.metrics,
                                                provider=provider)

        # Holds ledgers of different types with their info like callbacks, state, etc
        self.ledgerRegistry = {}  # type: Dict[int, LedgerInfo]

        # Largest 3 phase key received during catchup.
        # This field is needed to discard any stashed 3PC messages or
        # ordered messages since the transactions part of those messages
        # will be applied when they are received through the catchup process
        self.last_caught_up_3PC = (0, 0)
Пример #8
0
 def __init__(self, input: RxChannel, provider: CatchupDataProvider):
     router = Router(input)
     router.add(LedgerStatus, self.process_ledger_status)
     router.add(CatchupReq, self.process_catchup_req)
     self._provider = provider