def testPrimarySendsAPrepareAndMarkedSuspicious(looper, txnPoolNodeSet, delay_commits, preprepared1): def sendPrepareFromPrimary(instId): primary = getPrimaryReplica(txnPoolNodeSet, instId) viewNo, ppSeqNo = next(iter(primary._ordering_service.sentPrePrepares.keys())) ppReq = primary._ordering_service.sentPrePrepares[viewNo, ppSeqNo] primary._ordering_service._do_prepare(ppReq) def chk(): for r in getNonPrimaryReplicas(txnPoolNodeSet, instId): l = len([param for param in getAllArgs(r._ordering_service, r._ordering_service.process_prepare) if param['sender'] == primary.name]) assert l == 1 looper.run(eventually(chk)) sendPrepareFromPrimary(0) for node in txnPoolNodeSet: if node in getNonPrimaryReplicas(txnPoolNodeSet, 0): frm, reason, code = getAllArgs(node, TestNode.reportSuspiciousNode) assert frm == getPrimaryReplica(txnPoolNodeSet, 0).node.name assert isinstance(reason, SuspiciousNode) assert len(getNodeSuspicions(node, Suspicions.PR_FRM_PRIMARY.code)) == 10
def testPrimarySendsAPrepareAndMarkedSuspicious(looper, nodeSet, preprepared1): def sendPrepareFromPrimary(instId): primary = getPrimaryReplica(nodeSet, instId) viewNo, ppSeqNo = next(iter(primary.sentPrePrepares.keys())) prepare = Prepare(instId, viewNo, ppSeqNo, preprepared1.digest, time.time()) primary.doPrepare(prepare) def chk(): for r in getNonPrimaryReplicas(nodeSet, instId): l = len([ param for param in getAllArgs(r, r.processPrepare) if param['sender'] == primary.name ]) assert l == 1 looper.run(eventually(chk)) sendPrepareFromPrimary(0) for node in nodeSet: if node in getNonPrimaryReplicas(nodeSet, 0): frm, reason, code = getAllArgs(node, TestNode.reportSuspiciousNode) assert frm == getPrimaryReplica(nodeSet, 0).node.name assert isinstance(reason, SuspiciousNode) assert len(getNodeSuspicions(node, Suspicions.PR_FRM_PRIMARY.code)) == 10
def chk(): for r in (primaryReplica, *remainingNpr): recvdPps = recvdPrePrepare(r) assert len(recvdPps) == 1 assert recvdPps[0]['pp'][:-1] == ppr[:-1] nodeSuspicions = len(getNodeSuspicions( r.node, Suspicions.PPR_FRM_NON_PRIMARY.code)) assert nodeSuspicions == 1
def chkSusp(): for r in nonPrimaryReps: # Every node with non primary replicas of instance 0 should raise # suspicion assert len(getNodeSuspicions(r.node, Suspicions.PPR_DIGEST_WRONG.code)) == 1 # No non primary replica should send any PREPARE assert len(sentPrepare(r)) == 0
def g(): for node in nodeSet: if node.name != maliciousNode.name: frm, reason, code = getAllArgs(node, Node.reportSuspiciousNode) assert frm == maliciousNode.name assert isinstance(reason, SuspiciousNode) assert len(getNodeSuspicions(node, Suspicions.FREQUENT_INST_CHNG.code)) == 13
def chkSusp(): for r in (primaryRep, *nonPrimaryReps): if r.name != faultyRep.name: # Every node except the one from which PREPARE with incorrect # digest was sent should raise suspicion for the PREPARE # message assert len(getNodeSuspicions(r.node, Suspicions.PR_DIGEST_WRONG.code)) == 1
def chkSusp(): for r in nonPrimaryReps: # Every node with non primary replicas of instance 0 should raise # suspicion twice, once for each extra PRE-PREPARE request assert len(getNodeSuspicions(r.node, Suspicions.DUPLICATE_PPR_SENT.code)) == 2 # Each non primary replica should just send one PREPARE assert len(sentPrepare(r)) == 1
def chkSusp(): for r in (primaryRep, *nonPrimaryReps): if r.name != faultyRep.name: # Every node except the one from which COMMIT with incorrect # digest was sent should raise suspicion for the COMMIT # message susps = getNodeSuspicions(r.node, Suspicions.CM_DIGEST_WRONG.code) assert len(susps) == 1
def chkSusp(): for r in (primaryRep, *nonPrimaryReps): if r.name != faultyRep.name: # Every node except the one from which duplicate COMMIT was # sent should raise suspicion twice, once for each extra # PREPARE request assert len(getNodeSuspicions(r.node, Suspicions.DUPLICATE_CM_SENT.code)) \ == 2
def chkSusp(): for r in (primaryRep, *nonPrimaryReps): if r.name != faultyRep.name: # Every node except the one from which duplicate COMMIT was # sent should raise suspicion twice, once for each extra # PREPARE request assert len( getNodeSuspicions(r.node, Suspicions.DUPLICATE_CM_SENT.code)) == 2
def chk(): for r in remainingNpr: recvdPps = recvd_pre_prepares(r) assert len(recvdPps) == 1 assert compareNamedTuple(recvdPps[0], ppr, f.DIGEST.nm, f.STATE_ROOT.nm, f.TXN_ROOT.nm) nodeSuspicions = len( getNodeSuspicions(r.node, Suspicions.PPR_FRM_NON_PRIMARY.code)) assert nodeSuspicions == 1
def chkSusp(): for r in nonPrimaryReps: # Every node with non primary replicas of instance 0 should raise # suspicion assert len( getNodeSuspicions(r.node, Suspicions.PPR_DIGEST_WRONG.code)) == 1 # No non primary replica should send any PREPARE assert len(sentPrepare(r)) == 0
def chk(): for r in remainingNpr: recvdPps = recvd_pre_prepares(r) assert len(recvdPps) == 1 assert compareNamedTuple(recvdPps[0], ppr, f.DIGEST.nm, f.STATE_ROOT.nm, f.TXN_ROOT.nm) nodeSuspicions = len(getNodeSuspicions( r.node, Suspicions.PPR_FRM_NON_PRIMARY.code)) assert nodeSuspicions == 1
def chkSusp(): for r in nonPrimaryReps: # Every node with non primary replicas of instance 0 should raise # suspicion susp_code = Suspicions.PPR_DIGEST_WRONG.code # Since the node sending bad requests might become primary of # some backup instance after view changes, it will again send a # PRE-PREPARE with incorrect digest, so other nodes might raise # suspicion more than once assert len(getNodeSuspicions(r.node, susp_code)) >= 1 # No non primary replica should send any PREPARE assert len(sentPrepare(r, viewNo=0, ppSeqNo=1)) == 0
def testPrimarySendsAPrepareAndMarkedSuspicious(looper, nodeSet, preprepared1): def sendPrepareFromPrimary(instId): primary = getPrimaryReplica(nodeSet, instId) preprepared1.viewNo = instId preprepared1.ppSeqNo = primary.prePrepareSeqNo primary.doPrepare(preprepared1) for r in getNonPrimaryReplicas(nodeSet, instId): l = len([param for param in getAllArgs(r, r.processPrepare) if param['sender'] == primary.name]) assert l == 1 sendPrepareFromPrimary(0) for node in nodeSet: if node in getNonPrimaryReplicas(nodeSet, 0): frm, reason, code = getAllArgs(node, Node.reportSuspiciousNode) assert frm == getPrimaryReplica(nodeSet, 0).node.name assert isinstance(reason, SuspiciousNode) assert len(getNodeSuspicions(node, Suspicions.PR_FRM_PRIMARY.code)) \ == 10
def testPrimarySendsAPrepareAndMarkedSuspicious(looper, nodeSet, preprepared1): def sendPrepareFromPrimary(instId): primary = getPrimaryReplica(nodeSet, instId) preprepared1.viewNo = instId preprepared1.ppSeqNo = primary.prePrepareSeqNo primary.doPrepare(preprepared1) for r in getNonPrimaryReplicas(nodeSet, instId): l = len([ param for param in getAllArgs(r, r.processPrepare) if param['sender'] == primary.name ]) assert l == 1 sendPrepareFromPrimary(0) for node in nodeSet: if node in getNonPrimaryReplicas(nodeSet, 0): frm, reason, code = getAllArgs(node, Node.reportSuspiciousNode) assert frm == getPrimaryReplica(nodeSet, 0).node.name assert isinstance(reason, SuspiciousNode) assert len(getNodeSuspicions(node, Suspicions.PR_FRM_PRIMARY.code)) \ == 10
def chk(): for r in getNonPrimaryReplicas(nodeSet, instId): nodeSuspicions = len(getNodeSuspicions( r.node, Suspicions.WRONG_PPSEQ_NO.code)) assert nodeSuspicions == 1
def get_timestamp_suspicion_count(node): return len(getNodeSuspicions(node, Suspicions.PPR_TIME_WRONG.code))
def chk(): for r in getNonPrimaryReplicas(nodeSet, instId): nodeSuspicions = len( getNodeSuspicions(r.node, Suspicions.WRONG_PPSEQ_NO.code)) assert nodeSuspicions == 1