def processLedgerStatus(self, status: LedgerStatus, frm: str): logger.debug("{} received ledger status: {} from {}".format( self, status, frm)) # Nodes might not be using pool txn ledger, might be using simple node # registries (old approach) ledgerStatus = LedgerStatus(*status) if status else None if ledgerStatus.txnSeqNo < 0: self.discard(status, reason="Received negative sequence " "number from {}".format(frm), logMethod=logger.warn) if not status: logger.debug("{} found ledger status to be null from {}".format( self, frm)) return ledgerType = getattr(status, f.LEDGER_TYPE.nm) # If this is a node's ledger manager and sender of this ledger status # is a client and its pool ledger is same as this node's pool ledger # then send the pool ledger status since client wont be receiving the # consistency proof: statusFromClient = self.getStack(frm) == self.clientstack if self.ownedByNode and statusFromClient: if ledgerType != 0: logger.debug("{} received inappropriate ledger status {} from " "client {}".format(self, status, frm)) return else: if self.isLedgerSame(ledgerStatus): ledger = self.ledgers[0]["ledger"] ledgerStatus = LedgerStatus(0, ledger.size, ledger.root_hash) self.sendTo(ledgerStatus, frm) # If a ledger is yet to sync and cannot sync right now, # then stash the ledger status to be processed later if self.ledgers[ledgerType]["state"] != LedgerState.synced and \ not self.ledgers[ledgerType]["canSync"]: self.stashLedgerStatus(ledgerType, status, frm) return # If this manager is owned by a node and the node's ledger is ahead of # the received ledger status if self.ownedByNode and self.isLedgerNew(ledgerStatus): consistencyProof = self.getConsistencyProof(ledgerStatus) self.sendTo(consistencyProof, frm) if not self.isLedgerOld(ledgerStatus) and not statusFromClient: # This node's ledger is not older so it will not receive a # consistency proof unless the other node processes a transaction # post sending this ledger status self.recvdConsistencyProofs[ledgerType][frm] = None self.ledgerStatusOk[ledgerType].add(frm) if len(self.ledgerStatusOk[ledgerType]) == 2 * self.owner.f: logger.debug("{} found out from {} that its ledger of type {} " "is latest".format( self, self.ledgerStatusOk[ledgerType], ledgerType)) if self.ledgers[ledgerType]["state"] != LedgerState.synced: self.catchupCompleted(ledgerType)
def sendDLStatus(self, name): size = self.primaryStorage.size newSize = randint(1, size) while newSize in sentSizes: newSize = randint(1, size) print("new size {}".format(newSize)) newRootHash = base64.b64encode( self.domainLedger.tree.merkle_tree_hash(0, newSize)).decode() ledgerStatus = LedgerStatus(1, newSize, newRootHash) print("dl status {}".format(ledgerStatus)) rid = self.nodestack.getRemote(name).uid self.send(ledgerStatus, rid) sentSizes.add(newSize)
def sendLedgerStatus(self, nodeName: str): ledgerStatus = LedgerStatus(0, self.ledger.size, self.ledger.root_hash) rid = self.nodestack.getRemote(nodeName).uid self.nodestack.send(ledgerStatus, rid)
def configLedgerStatus(self): return LedgerStatus(2, self.configLedger.size, self.configLedger.root_hash)