Skip to content

Commit 4bddb24

Browse files
author
Dmitry Surnin
committed
Merge remote-tracking branch 'origin/master' into file-struct
2 parents 6a1ba50 + 260721c commit 4bddb24

File tree

5 files changed

+66
-9
lines changed

5 files changed

+66
-9
lines changed

ci/code-validation.dockerfile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ FROM ubuntu:16.04
44
ARG uid=1000
55

66
# Install environment
7-
RUN apt-get update -y
8-
RUN apt-get install -y \
7+
RUN apt-get update -y && apt-get install -y \
98
git \
109
wget \
1110
python3.5 \

plenum/client/client.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ def __init__(self,
192192
logger.debug("total plugins loaded in client: {}".format(tp))
193193

194194
self._multi_sig_verifier = self._create_multi_sig_verifier()
195+
self._read_only_requests = set()
195196

196197
@lazy_field
197198
def _bls_register(self):
@@ -276,11 +277,14 @@ async def prod(self, limit) -> int:
276277
def submitReqs(self, *reqs: Request) -> List[Request]:
277278
requests = []
278279
errs = []
280+
279281
for request in reqs:
280-
if (self.mode == Mode.discovered and self.hasSufficientConnections) or (
281-
request.isForced() and self.hasAnyConnections):
282-
logger.debug(
283-
'Client {} sending request {}'.format(self, request))
282+
if (self.mode == Mode.discovered and self.hasSufficientConnections) or \
283+
(self.hasAnyConnections and
284+
(request.txn_type in self._read_only_requests or request.isForced())):
285+
286+
logger.debug('Client {} sending request {}'
287+
.format(self, request))
284288
stat, err_msg = self.send(request)
285289
if stat:
286290
self.expectingFor(request)
@@ -292,7 +296,7 @@ def submitReqs(self, *reqs: Request) -> List[Request]:
292296
else:
293297
logger.debug(
294298
"{} pending request since in mode {} and "
295-
"connected to {} nodes". format(
299+
"connected to {} nodes".format(
296300
self, self.mode, self.nodestack.connecteds))
297301
self.pendReqsTillConnection(request)
298302
requests.append(request)

plenum/common/request.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from typing import Mapping, NamedTuple
33

44
from common.serializers.serialization import serialize_msg_for_signing
5-
from plenum.common.constants import REQDIGEST, REQKEY, FORCE, CURRENT_PROTOCOL_VERSION
5+
from plenum.common.constants import REQDIGEST, REQKEY, FORCE, TXN_TYPE, CURRENT_PROTOCOL_VERSION
66
from plenum.common.messages.client_request import ClientMessageValidator
77
from plenum.common.types import f, OPERATION
88
from stp_core.types import Identifier
@@ -87,6 +87,10 @@ def isForced(self):
8787
force = self.operation.get(FORCE)
8888
return str(force) == 'True'
8989

90+
@property
91+
def txn_type(self):
92+
return self.operation.get(TXN_TYPE)
93+
9094
def __hash__(self):
9195
return hash(self.serialized())
9296

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import random
2+
3+
from plenum.test.client.conftest import passThroughReqAcked1
4+
5+
from plenum.test.helper import sendReqsToNodesAndVerifySuffReplies, stopNodes, waitForSufficientRepliesForRequests, \
6+
send_signed_requests
7+
from plenum.test.malicious_behaviors_client import \
8+
genDoesntSendRequestToSomeNodes
9+
from plenum.test.node_catchup.helper import waitNodeDataEquality
10+
11+
12+
nodeCount = 4
13+
clientFault = genDoesntSendRequestToSomeNodes("AlphaC")
14+
reqAcked1 = passThroughReqAcked1
15+
16+
17+
def test_client_sends_get_request_to_one_node(looper,
18+
client1,
19+
wallet1,
20+
nodeSet):
21+
"""
22+
Check that read only equest can be sent
23+
without having connection to all nodes
24+
"""
25+
client = client1
26+
wallet = wallet1
27+
28+
nodes_to_stop = list(nodeSet)[1:]
29+
stopNodes(nodes_to_stop, looper)
30+
31+
initial_submit_count = client.spylog.count(client.submitReqs)
32+
initial_send_count = client.spylog.count(client.send)
33+
34+
def sign_and_send(op):
35+
signed = wallet.signOp(op)
36+
send_signed_requests(client, [signed])
37+
38+
buy = {'type': 'buy', 'amount': random.randint(10, 100)}
39+
sign_and_send(buy)
40+
assert initial_submit_count + 1 == client.spylog.count(client.submitReqs)
41+
assert initial_send_count == client.spylog.count(client.send)
42+
43+
get_buy = {'type': 'get_buy'}
44+
client._read_only_requests.add('get_buy')
45+
sign_and_send(get_buy)
46+
assert initial_submit_count + 2 == client.spylog.count(client.submitReqs)
47+
assert initial_send_count + 1 == client.spylog.count(client.send)

plenum/test/test_client.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@
2121

2222
logger = getlogger()
2323

24-
client_spyables = [Client.handleOneNodeMsg, Client.resendRequests]
24+
client_spyables = [Client.handleOneNodeMsg,
25+
Client.resendRequests,
26+
Client.send,
27+
Client.submitReqs]
2528

2629

2730
@spyable(methods=client_spyables)

0 commit comments

Comments
 (0)