Skip to content

Commit 91af767

Browse files
authored
Merge pull request #75 from hyperledger/master
Master
2 parents 43cafa9 + b2c817f commit 91af767

File tree

3 files changed

+225
-14
lines changed

3 files changed

+225
-14
lines changed

Jenkinsfile.cd

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,6 @@
55

66
def name = 'indy-plenum'
77

8-
properties([
9-
[$class: 'BuildDiscarderProperty', strategy: [
10-
$class: 'LogRotator',
11-
artifactDaysToKeepStr: '7',
12-
artifactNumToKeepStr: '',
13-
daysToKeepStr: '7',
14-
numToKeepStr: ''
15-
]]
16-
]);
17-
188
def plenumTestUbuntu = { offset, increment ->
199
try {
2010
echo 'Ubuntu Test: Checkout csm'

plenum/server/node.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2005,17 +2005,26 @@ def processPropagate(self, msg: Propagate, frm):
20052005
"""
20062006
logger.debug("Node {} received propagated request: {}".
20072007
format(self.name, msg))
2008-
reqDict = msg.request
20092008

2009+
reqDict = msg.request
20102010
request = self._client_request_class(**reqDict)
20112011

20122012
clientName = msg.senderClient
20132013

20142014
if not self.isProcessingReq(*request.key):
2015+
if self.seqNoDB.get(request.identifier, request.reqId) is not None:
2016+
logger.debug("{} ignoring propagated request {} "
2017+
"since it has been already ordered"
2018+
.format(self.name, msg))
2019+
return
2020+
20152021
self.startedProcessingReq(*request.key, clientName)
2016-
elif clientName is not None and not self.is_sender_known_for_req(*request.key):
2017-
# Since some propagates might not include the client name
2018-
self.set_sender_for_req(*request.key, clientName)
2022+
2023+
else:
2024+
if clientName is not None and \
2025+
not self.is_sender_known_for_req(*request.key):
2026+
# Since some propagates might not include the client name
2027+
self.set_sender_for_req(*request.key, clientName)
20192028

20202029
self.requests.add_propagate(request, frm)
20212030

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
from plenum.test import waits
2+
from plenum.test.delayers import cDelay, req_delay, ppgDelay
3+
from plenum.test.helper import waitForSufficientRepliesForRequests, \
4+
randomOperation
5+
from plenum.test.pool_transactions.conftest import looper, clientAndWallet1, \
6+
client1, wallet1, client1Connected
7+
from plenum.test.test_node import ensureElectionsDone
8+
from plenum.test.view_change.helper import ensure_view_change
9+
10+
11+
def test_repeated_request_not_processed_if_already_ordered(
12+
looper, txnPoolNodeSet, wallet1, client1, client1Connected):
13+
14+
delta = txnPoolNodeSet[3]
15+
initial_ledger_size = delta.domainLedger.size
16+
17+
req = wallet1.signOp(randomOperation())
18+
client1.submitReqs(req)
19+
waitForSufficientRepliesForRequests(looper, client1, requests=[req])
20+
21+
client1.submitReqs(req)
22+
looper.runFor(waits.expectedTransactionExecutionTime(len(txnPoolNodeSet)))
23+
24+
for node in txnPoolNodeSet:
25+
assert node.domainLedger.size - initial_ledger_size == 1
26+
27+
28+
def test_belated_request_not_processed_if_already_ordered(
29+
looper, txnPoolNodeSet, wallet1, client1, client1Connected):
30+
31+
delta = txnPoolNodeSet[3]
32+
initial_ledger_size = delta.domainLedger.size
33+
delta.clientIbStasher.delay(req_delay(300))
34+
35+
req = wallet1.signOp(randomOperation())
36+
client1.submitReqs(req)
37+
waitForSufficientRepliesForRequests(looper, client1, requests=[req])
38+
39+
delta.clientIbStasher.reset_delays_and_process_delayeds()
40+
looper.runFor(waits.expectedTransactionExecutionTime(len(txnPoolNodeSet)))
41+
42+
for node in txnPoolNodeSet:
43+
assert node.domainLedger.size - initial_ledger_size == 1
44+
45+
46+
def test_belated_propagate_not_processed_if_already_ordered(
47+
looper, txnPoolNodeSet, wallet1, client1, client1Connected):
48+
49+
delta = txnPoolNodeSet[3]
50+
initial_ledger_size = delta.domainLedger.size
51+
delta.nodeIbStasher.delay(ppgDelay(300, 'Gamma'))
52+
53+
req = wallet1.signOp(randomOperation())
54+
client1.submitReqs(req)
55+
waitForSufficientRepliesForRequests(looper, client1, requests=[req])
56+
57+
delta.nodeIbStasher.reset_delays_and_process_delayeds()
58+
looper.runFor(waits.expectedTransactionExecutionTime(len(txnPoolNodeSet)))
59+
60+
for node in txnPoolNodeSet:
61+
assert node.domainLedger.size - initial_ledger_size == 1
62+
63+
64+
def test_repeated_request_not_processed_if_already_in_3pc_process(
65+
looper, txnPoolNodeSet, wallet1, client1, client1Connected):
66+
67+
delta = txnPoolNodeSet[3]
68+
initial_ledger_size = delta.domainLedger.size
69+
for node in txnPoolNodeSet:
70+
node.nodeIbStasher.delay(cDelay(300))
71+
72+
req = wallet1.signOp(randomOperation())
73+
client1.submitReqs(req)
74+
looper.runFor(waits.expectedPropagateTime(len(txnPoolNodeSet)) +
75+
waits.expectedPrePrepareTime(len(txnPoolNodeSet)) +
76+
waits.expectedPrepareTime(len(txnPoolNodeSet)) +
77+
waits.expectedCommittedTime(len(txnPoolNodeSet)))
78+
79+
client1.submitReqs(req)
80+
looper.runFor(waits.expectedPropagateTime(len(txnPoolNodeSet)) +
81+
waits.expectedPrePrepareTime(len(txnPoolNodeSet)) +
82+
waits.expectedPrepareTime(len(txnPoolNodeSet)) +
83+
waits.expectedCommittedTime(len(txnPoolNodeSet)))
84+
85+
for node in txnPoolNodeSet:
86+
node.nodeIbStasher.reset_delays_and_process_delayeds()
87+
looper.runFor(waits.expectedOrderingTime(delta.replicas.num_replicas))
88+
89+
for node in txnPoolNodeSet:
90+
assert node.domainLedger.size - initial_ledger_size == 1
91+
92+
93+
def test_belated_request_not_processed_if_already_in_3pc_process(
94+
looper, txnPoolNodeSet, wallet1, client1, client1Connected):
95+
96+
delta = txnPoolNodeSet[3]
97+
initial_ledger_size = delta.domainLedger.size
98+
delta.clientIbStasher.delay(req_delay(300))
99+
for node in txnPoolNodeSet:
100+
node.nodeIbStasher.delay(cDelay(300))
101+
102+
req = wallet1.signOp(randomOperation())
103+
client1.submitReqs(req)
104+
looper.runFor(waits.expectedPropagateTime(len(txnPoolNodeSet)) +
105+
waits.expectedPrePrepareTime(len(txnPoolNodeSet)) +
106+
waits.expectedPrepareTime(len(txnPoolNodeSet)) +
107+
waits.expectedCommittedTime(len(txnPoolNodeSet)))
108+
109+
delta.clientIbStasher.reset_delays_and_process_delayeds()
110+
looper.runFor(waits.expectedPropagateTime(len(txnPoolNodeSet)) +
111+
waits.expectedPrePrepareTime(len(txnPoolNodeSet)) +
112+
waits.expectedPrepareTime(len(txnPoolNodeSet)) +
113+
waits.expectedCommittedTime(len(txnPoolNodeSet)))
114+
115+
for node in txnPoolNodeSet:
116+
node.nodeIbStasher.reset_delays_and_process_delayeds()
117+
looper.runFor(waits.expectedOrderingTime(delta.replicas.num_replicas))
118+
119+
for node in txnPoolNodeSet:
120+
assert node.domainLedger.size - initial_ledger_size == 1
121+
122+
123+
def test_belated_propagate_not_processed_if_already_in_3pc_process(
124+
looper, txnPoolNodeSet, wallet1, client1, client1Connected):
125+
126+
delta = txnPoolNodeSet[3]
127+
initial_ledger_size = delta.domainLedger.size
128+
delta.nodeIbStasher.delay(ppgDelay(300, 'Gamma'))
129+
for node in txnPoolNodeSet:
130+
node.nodeIbStasher.delay(cDelay(300))
131+
132+
req = wallet1.signOp(randomOperation())
133+
client1.submitReqs(req)
134+
looper.runFor(waits.expectedPropagateTime(len(txnPoolNodeSet)) +
135+
waits.expectedPrePrepareTime(len(txnPoolNodeSet)) +
136+
waits.expectedPrepareTime(len(txnPoolNodeSet)) +
137+
waits.expectedCommittedTime(len(txnPoolNodeSet)))
138+
139+
delta.nodeIbStasher.reset_delays_and_process_delayeds('PROPAGATE')
140+
looper.runFor(waits.expectedPropagateTime(len(txnPoolNodeSet)) +
141+
waits.expectedPrePrepareTime(len(txnPoolNodeSet)) +
142+
waits.expectedPrepareTime(len(txnPoolNodeSet)) +
143+
waits.expectedCommittedTime(len(txnPoolNodeSet)))
144+
145+
for node in txnPoolNodeSet:
146+
node.nodeIbStasher.reset_delays_and_process_delayeds('COMMIT')
147+
looper.runFor(waits.expectedOrderingTime(delta.replicas.num_replicas))
148+
149+
for node in txnPoolNodeSet:
150+
assert node.domainLedger.size - initial_ledger_size == 1
151+
152+
153+
def test_repeated_request_not_processed_after_view_change(
154+
looper, txnPoolNodeSet, wallet1, client1, client1Connected):
155+
156+
delta = txnPoolNodeSet[3]
157+
initial_ledger_size = delta.domainLedger.size
158+
159+
req = wallet1.signOp(randomOperation())
160+
client1.submitReqs(req)
161+
waitForSufficientRepliesForRequests(looper, client1, requests=[req])
162+
163+
ensure_view_change(looper, txnPoolNodeSet)
164+
ensureElectionsDone(looper, txnPoolNodeSet)
165+
166+
client1.submitReqs(req)
167+
looper.runFor(waits.expectedTransactionExecutionTime(len(txnPoolNodeSet)))
168+
169+
for node in txnPoolNodeSet:
170+
assert node.domainLedger.size - initial_ledger_size == 1
171+
172+
173+
def test_belated_request_not_processed_after_view_change(
174+
looper, txnPoolNodeSet, wallet1, client1, client1Connected):
175+
176+
delta = txnPoolNodeSet[3]
177+
initial_ledger_size = delta.domainLedger.size
178+
delta.clientIbStasher.delay(req_delay(300))
179+
180+
req = wallet1.signOp(randomOperation())
181+
client1.submitReqs(req)
182+
waitForSufficientRepliesForRequests(looper, client1, requests=[req])
183+
184+
ensure_view_change(looper, txnPoolNodeSet)
185+
ensureElectionsDone(looper, txnPoolNodeSet)
186+
187+
delta.clientIbStasher.reset_delays_and_process_delayeds()
188+
looper.runFor(waits.expectedTransactionExecutionTime(len(txnPoolNodeSet)))
189+
190+
for node in txnPoolNodeSet:
191+
assert node.domainLedger.size - initial_ledger_size == 1
192+
193+
194+
def test_belated_propagate_not_processed_after_view_change(
195+
looper, txnPoolNodeSet, wallet1, client1, client1Connected):
196+
197+
delta = txnPoolNodeSet[3]
198+
initial_ledger_size = delta.domainLedger.size
199+
delta.nodeIbStasher.delay(ppgDelay(300, 'Gamma'))
200+
201+
req = wallet1.signOp(randomOperation())
202+
client1.submitReqs(req)
203+
waitForSufficientRepliesForRequests(looper, client1, requests=[req])
204+
205+
ensure_view_change(looper, txnPoolNodeSet)
206+
ensureElectionsDone(looper, txnPoolNodeSet)
207+
208+
delta.nodeIbStasher.reset_delays_and_process_delayeds()
209+
looper.runFor(waits.expectedTransactionExecutionTime(len(txnPoolNodeSet)))
210+
211+
for node in txnPoolNodeSet:
212+
assert node.domainLedger.size - initial_ledger_size == 1

0 commit comments

Comments
 (0)