Skip to content

Commit 9e1f5ab

Browse files
authored
Merge pull request #89 from hyperledger/master
Master
2 parents c0bd0d3 + e3148f9 commit 9e1f5ab

35 files changed

+922
-422
lines changed

plenum/server/node.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,10 +1118,11 @@ def onConnsChanged(self, joined: Set[str], left: Set[str]):
11181118

11191119
if self.isReady():
11201120
self.checkInstances()
1121-
for node in joined:
1122-
self.send_current_state_to_lagging_node(node)
1121+
else:
1122+
logger.debug("{} joined nodes {} but status is {}".format(self, joined, self.status))
11231123
# Send ledger status whether ready (connected to enough nodes) or not
11241124
for node in joined:
1125+
self.send_current_state_to_lagging_node(node)
11251126
self.send_ledger_status_to_newly_connected_node(node)
11261127

11271128
def request_ledger_status_from_nodes(self, ledger_id):
@@ -2567,7 +2568,7 @@ def updateSeqNoMap(self, committedTxns):
25672568

25682569
def commitAndSendReplies(self, reqHandler, ppTime, reqs: List[Request],
25692570
stateRoot, txnRoot) -> List:
2570-
committedTxns = reqHandler.commit(len(reqs), stateRoot, txnRoot)
2571+
committedTxns = reqHandler.commit(len(reqs), stateRoot, txnRoot, ppTime)
25712572
self.updateSeqNoMap(committedTxns)
25722573
self.sendRepliesToClients(
25732574
map(self.update_txn_with_extra_data, committedTxns),

plenum/server/pool_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ def executePoolTxnBatch(self, ppTime, reqs, stateRoot, txnRoot) -> List:
200200
:param ppTime: PrePrepare request time
201201
:param reqs: request
202202
"""
203-
committedTxns = self.reqHandler.commit(len(reqs), stateRoot, txnRoot)
203+
committedTxns = self.reqHandler.commit(len(reqs), stateRoot, txnRoot, ppTime)
204204
self.node.updateSeqNoMap(committedTxns)
205205
for txn in committedTxns:
206206
t = deepcopy(txn)

plenum/server/replica.py

Lines changed: 175 additions & 202 deletions
Large diffs are not rendered by default.

plenum/server/req_handler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def updateState(self, txns, isCommitted=False):
4848
not committed transactions
4949
"""
5050

51-
def commit(self, txnCount, stateRoot, txnRoot) -> List:
51+
def commit(self, txnCount, stateRoot, txnRoot, ppTime) -> List:
5252
"""
5353
:param txnCount: The number of requests to commit (The actual requests
5454
are picked up from the uncommitted list from the ledger)

plenum/test/batching_3pc/test_basic_batching.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import types
22
import pytest
3-
from plenum.common.exceptions import UnauthorizedClientRequest
3+
from plenum.common.exceptions import UnauthorizedClientRequest, RequestRejectedException
44
from plenum.test.batching_3pc.helper import checkNodesHaveSameRoots
5-
from plenum.test.helper import sendRandomRequests, checkRejectWithReason, waitForSufficientRepliesForRequests
5+
from plenum.test.helper import sdk_send_random_requests, sdk_get_and_check_replies
66
from stp_core.loop.eventually import eventually
77
from plenum.common.exceptions import InvalidClientRequest
88
from plenum.test.helper import sdk_sign_request_from_dict, sdk_send_random_and_check
99
from plenum.common.request import Request
1010

1111

12-
def testRequestStaticValidation(tconf, looper,txnPoolNodeSet,
12+
def testRequestStaticValidation(tconf, looper, txnPoolNodeSet,
1313
sdk_wallet_client):
1414
"""
1515
Check that for requests which fail static validation, REQNACK is sent
@@ -59,7 +59,7 @@ def testTreeRootsCorrectAfterEachBatch(tconf, looper, txnPoolNodeSet,
5959

6060

6161
def testRequestDynamicValidation(tconf, looper, txnPoolNodeSet,
62-
client, wallet1):
62+
sdk_pool_handle, sdk_wallet_client):
6363
"""
6464
Check that for requests which fail dynamic (state based) validation,
6565
REJECT is sent to the client
@@ -82,16 +82,14 @@ def rejectingMethod(self, req):
8282
origMethods.append(node.doDynamicValidation)
8383
node.doDynamicValidation = types.MethodType(rejectingMethod, node)
8484

85-
reqs = sendRandomRequests(wallet1, client, tconf.Max3PCBatchSize)
86-
waitForSufficientRepliesForRequests(looper, client, requests=reqs[:-1])
85+
reqs = sdk_send_random_requests(looper, sdk_pool_handle,
86+
sdk_wallet_client,
87+
tconf.Max3PCBatchSize)
88+
sdk_get_and_check_replies(looper, reqs[:-1])
89+
with pytest.raises(RequestRejectedException) as e:
90+
sdk_get_and_check_replies(looper, reqs[-1:])
8791

88-
with pytest.raises(AssertionError):
89-
waitForSufficientRepliesForRequests(looper, client, requests=reqs[-1:])
90-
91-
for node in txnPoolNodeSet:
92-
looper.run(eventually(checkRejectWithReason, client,
93-
'Simulated rejection', node.clientstack.name,
94-
retryWait=1))
92+
assert 'Simulated rejection' in e._excinfo[1].args[0]
9593

9694
for i, node in enumerate(txnPoolNodeSet):
9795
node.doDynamicValidation = origMethods[i]

plenum/test/delayers.py

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from plenum.common.util import getCallableName
1414
from plenum.test.test_client import TestClient
1515

16+
DEFAULT_DELAY = 600
1617

1718
def delayer(seconds, op, senderFilter=None, instFilter: int = None):
1819
def inner(rx):
@@ -74,83 +75,83 @@ def inner(action_pair):
7475
return inner
7576

7677

77-
def nom_delay(delay: float, inst_id=None, sender_filter: str=None):
78+
def nom_delay(delay: float = DEFAULT_DELAY, inst_id=None, sender_filter: str=None):
7879
# Delayer of NOMINATE requests
7980
return delayerMsgTuple(
8081
delay, Nomination, instFilter=inst_id, senderFilter=sender_filter)
8182

8283

83-
def prim_delay(delay: float, inst_id=None, sender_filter: str=None):
84+
def prim_delay(delay: float = DEFAULT_DELAY, inst_id=None, sender_filter: str=None):
8485
# Delayer of PRIMARY requests
8586
return delayerMsgTuple(
8687
delay, Primary, instFilter=inst_id, senderFilter=sender_filter)
8788

8889

89-
def rel_delay(delay: float, inst_id=None, sender_filter: str=None):
90+
def rel_delay(delay: float = DEFAULT_DELAY, inst_id=None, sender_filter: str=None):
9091
# Delayer of REELECTION requests
9192
return delayerMsgTuple(
9293
delay, Reelection, instFilter=inst_id, senderFilter=sender_filter)
9394

9495

95-
def ppgDelay(delay: float, sender_filter: str=None):
96+
def ppgDelay(delay: float = DEFAULT_DELAY, sender_filter: str=None):
9697
# Delayer of PROPAGATE requests
9798
return delayerMsgTuple(delay, Propagate, senderFilter=sender_filter)
9899

99100

100-
def ppDelay(delay: float, instId: int=None, sender_filter: str=None):
101+
def ppDelay(delay: float = DEFAULT_DELAY, instId: int=None, sender_filter: str=None):
101102
# Delayer of PRE-PREPARE requests from a particular instance
102103
return delayerMsgTuple(delay, PrePrepare, instFilter=instId,
103104
senderFilter=sender_filter)
104105

105106

106-
def pDelay(delay: float, instId: int=None, sender_filter: str=None):
107+
def pDelay(delay: float = DEFAULT_DELAY, instId: int=None, sender_filter: str=None):
107108
# Delayer of PREPARE requests from a particular instance
108109
return delayerMsgTuple(
109110
delay, Prepare, instFilter=instId, senderFilter=sender_filter)
110111

111112

112-
def cDelay(delay: float, instId: int=None, sender_filter: str=None):
113+
def cDelay(delay: float = DEFAULT_DELAY, instId: int=None, sender_filter: str=None):
113114
# Delayer of COMMIT requests from a particular instance
114115
return delayerMsgTuple(
115116
delay, Commit, instFilter=instId, senderFilter=sender_filter)
116117

117118

118-
def icDelay(delay: float):
119+
def icDelay(delay: float = DEFAULT_DELAY):
119120
# Delayer of INSTANCE-CHANGE requests
120121
return delayerMsgTuple(delay, InstanceChange)
121122

122123

123-
def vcd_delay(delay: float):
124+
def vcd_delay(delay: float = DEFAULT_DELAY):
124125
# Delayer of VIEW_CHANGE_DONE requests
125126
return delayerMsgTuple(delay, ViewChangeDone)
126127

127128

128-
def lsDelay(delay: float):
129+
def lsDelay(delay: float = DEFAULT_DELAY):
129130
# Delayer of LEDGER_STATUSES requests
130131
return delayerMsgTuple(delay, LedgerStatus)
131132

132133

133-
def cpDelay(delay: float):
134+
def cpDelay(delay: float = DEFAULT_DELAY):
134135
# Delayer of CONSISTENCY_PROOFS requests
135136
return delayerMsgTuple(delay, ConsistencyProof)
136137

137138

138-
def cqDelay(delay: float):
139+
def cqDelay(delay: float = DEFAULT_DELAY):
139140
# Delayer of CATCHUP_REQ requests
140141
return delayerMsgTuple(delay, CatchupReq)
141142

142143

143-
def cr_delay(delay: float):
144+
def cr_delay(delay: float = DEFAULT_DELAY):
144145
# Delayer of CATCHUP_REP requests
145146
return delayerMsgTuple(delay, CatchupRep)
146147

147148

148-
def req_delay(delay: float):
149+
def req_delay(delay: float = DEFAULT_DELAY):
149150
# Delayer of Request requests
150151
return delayerMsgTuple(delay, Request)
151152

152153

153-
def msg_req_delay(delay: float, types_to_delay: List=None):
154+
def msg_req_delay(delay: float = DEFAULT_DELAY, types_to_delay: List=None):
154155
# Delayer of MessageReq messages
155156
def specific_msgs(msg):
156157
if isinstance(
@@ -162,7 +163,7 @@ def specific_msgs(msg):
162163
return specific_msgs
163164

164165

165-
def msg_rep_delay(delay: float, types_to_delay: List=None):
166+
def msg_rep_delay(delay: float = DEFAULT_DELAY, types_to_delay: List=None):
166167
# Delayer of MessageRep messages
167168
def specific_msgs(msg):
168169
if isinstance(

plenum/test/instances/test_instance_cannot_become_active_with_less_than_four_servers.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@
1111
checkNodeRemotes
1212
from plenum.test.test_stack import CONNECTED, JOINED_NOT_ALLOWED
1313
from plenum.test import waits
14-
15-
16-
whitelist = ['discarding message']
14+
from plenum.test.pool_transactions.conftest import looper
1715

1816
logger = getlogger()
1917

@@ -59,7 +57,9 @@ def addNodeBackAndCheck(nodeIdx: int, expectedStatus: Status):
5957
addNodeBack(nodeSet, looper, nodeNames[nodeIdx])
6058

6159
timeout = waits.expectedNodeStartUpTimeout() + \
62-
waits.expectedPoolInterconnectionTime(len(nodeSet))
60+
waits.expectedPoolInterconnectionTime(len(nodeSet))
61+
# TODO: Probably it's better to modify waits.* functions
62+
timeout *= 1.5
6363
looper.run(eventually(checkNodeStatusRemotesAndF,
6464
expectedStatus,
6565
nodeIdx,

plenum/test/instances/test_msgs_from_slow_instances.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,30 @@
66
from plenum.test.delayers import delayerMsgTuple
77
from plenum.test.test_node import TestNode
88
from plenum.test import waits
9-
9+
from plenum.test.pool_transactions.conftest import looper
10+
from plenum.test.node_request.conftest import committed1, \
11+
prepared1, preprepared1, propagated1, reqAcked1, \
12+
sent1, noRetryReq, faultyNodes
1013

1114
nodeCount = 4
1215

1316
faultyNodes = 1
1417

1518

1619
@pytest.fixture()
17-
def configNodeSet(nodeSet):
18-
A, B, C, D = nodeSet.nodes.values()
20+
def configNodeSet(txnPoolNodeSet):
21+
A, B, C, D = txnPoolNodeSet
1922
# Nodes C and D delay Commit request from node A for protocol instance 0
2023
for n in [C, D]:
2124
n.nodeIbStasher.delay(delayerMsgTuple(30,
2225
Commit,
2326
senderFilter=A.name,
2427
instFilter=0))
25-
return nodeSet
28+
return txnPoolNodeSet
2629

2730

2831
def testMsgFromInstanceDelay(configNodeSet, looper, prepared1):
29-
A, B, C, D = configNodeSet.nodes.values()
32+
A, B, C, D = configNodeSet
3033

3134
def getCommits(node: TestNode, instId: int):
3235
replica = node.replicas[instId] # type: Replica
@@ -41,6 +44,6 @@ def checkPresence():
4144
assert len(commReqs) > 0
4245
assert Replica.generateName(A.name, 1) in commReqs[0][0]
4346

44-
numOfNodes = len(configNodeSet.nodes)
47+
numOfNodes = len(configNodeSet)
4548
timeout = waits.expectedClientRequestPropagationTime(numOfNodes)
4649
looper.run(eventually(checkPresence, retryWait=.5, timeout=timeout))

plenum/test/instances/test_multiple_commit.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,16 @@
1212
sendDuplicate3PhaseMsg
1313
from plenum.test.test_node import getNonPrimaryReplicas, getPrimaryReplica
1414
from plenum.test import waits
15-
16-
whitelist = [Suspicions.DUPLICATE_CM_SENT.reason,
17-
'cannot process incoming COMMIT']
15+
from plenum.test.pool_transactions.conftest import looper
16+
from plenum.test.node_request.conftest import committed1, \
17+
prepared1, preprepared1, propagated1, reqAcked1, \
18+
sent1, noRetryReq, faultyNodes
1819

1920

2021
@pytest.fixture("module")
21-
def setup(nodeSet, up):
22-
primaryRep, nonPrimaryReps = getPrimaryReplica(nodeSet, 0), \
23-
getNonPrimaryReplicas(nodeSet, 0)
22+
def setup(txnPoolNodeSet):
23+
primaryRep, nonPrimaryReps = getPrimaryReplica(txnPoolNodeSet, 0), \
24+
getNonPrimaryReplicas(txnPoolNodeSet, 0)
2425

2526
faultyRep = nonPrimaryReps[0]
2627
makeNodeFaulty(faultyRep.node, partial(sendDuplicate3PhaseMsg,
@@ -32,13 +33,14 @@ def setup(nodeSet, up):
3233
# want to check for a particular suspicion
3334

3435
whitelistNode(faultyRep.node.name,
35-
[node for node in nodeSet if node != faultyRep.node],
36+
[node for node in txnPoolNodeSet if node != faultyRep.node],
3637
Suspicions.DUPLICATE_CM_SENT.code)
3738

3839
# If the request is ordered then COMMIT will be rejected much earlier
3940
for r in [primaryRep, *nonPrimaryReps]:
4041
def do_nothing(self, commit):
4142
pass
43+
4244
r.doOrder = types.MethodType(do_nothing, r)
4345

4446
return adict(primaryRep=primaryRep, nonPrimaryReps=nonPrimaryReps,
@@ -53,7 +55,7 @@ def testMultipleCommit(setup, looper, sent1):
5355
should count only one COMMIT from that sender
5456
"""
5557
primaryRep, nonPrimaryReps, faultyRep = setup.primaryRep, \
56-
setup.nonPrimaryReps, setup.faultyRep
58+
setup.nonPrimaryReps, setup.faultyRep
5759

5860
def chkSusp():
5961
for r in (primaryRep, *nonPrimaryReps):

plenum/test/instances/test_multiple_instance_change_msgs.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from plenum.test.spy_helpers import getAllArgs
1010
from plenum.test import waits
1111

12-
1312
nodeCount = 7
1413

1514

plenum/test/instances/test_multiple_pre_prepare.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,16 @@
1212
sendDuplicate3PhaseMsg
1313
from plenum.test.test_node import getNonPrimaryReplicas, getPrimaryReplica
1414
from plenum.test import waits
15-
16-
17-
whitelist = [Suspicions.DUPLICATE_PPR_SENT.reason,
18-
'cannot process incoming PRE-PREPARE',
19-
Suspicions.UNKNOWN_PR_SENT.reason,
20-
'Invalid prepare message received',
21-
'cannot process incoming PREPARE',
22-
Suspicions.UNKNOWN_CM_SENT.reason,
23-
'cannot process incoming COMMIT']
15+
from plenum.test.pool_transactions.conftest import looper
16+
from plenum.test.node_request.conftest import committed1, \
17+
prepared1, preprepared1, propagated1, reqAcked1, \
18+
sent1, noRetryReq, faultyNodes
2419

2520

2621
@pytest.fixture("module")
27-
def setup(nodeSet, up):
28-
primaryRep, nonPrimaryReps = getPrimaryReplica(nodeSet, 0), \
29-
getNonPrimaryReplicas(nodeSet, 0)
22+
def setup(txnPoolNodeSet):
23+
primaryRep, nonPrimaryReps = getPrimaryReplica(txnPoolNodeSet, 0), \
24+
getNonPrimaryReplicas(txnPoolNodeSet, 0)
3025

3126
# The primary replica would send 3 duplicate PRE-PREPARE requests to
3227
# non primary replicas

0 commit comments

Comments
 (0)