Skip to content

Commit 502e40a

Browse files
committed
PR Feedback
1 parent 8c33dda commit 502e40a

File tree

7 files changed

+24
-39
lines changed

7 files changed

+24
-39
lines changed

trinity/protocol/common/managers.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212
from cancel_token import CancelToken
1313

1414
from p2p.exceptions import (
15+
MalformedMessage,
1516
ValidationError,
1617
)
18+
from p2p.p2p_proto import DisconnectReason
1719
from p2p.peer import BasePeer, PeerSubscriber
1820
from p2p.protocol import (
1921
Command,
@@ -83,13 +85,14 @@ async def _handle_msg(self, msg: TResponse) -> None:
8385

8486
try:
8587
response = await self._normalize_response(msg)
86-
except ValidationError as err:
87-
self.logger.debug(
88-
"Malformed response for pending %s request from peer %s: %s",
88+
except MalformedMessage as err:
89+
self.logger.warn(
90+
"Malformed response for pending %s request from peer %s, disconnecting: %s",
8991
self.response_msg_name,
9092
self._peer,
9193
err,
9294
)
95+
await self._peer.disconnect(DisconnectReason.bad_protocol)
9396
return
9497

9598
try:

trinity/protocol/common/requests.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,6 @@ class BaseHeaderRequest(BaseRequest):
3232
skip: int
3333
reverse: bool
3434

35-
def validate_response(self, response: Tuple[BlockHeader, ...]) -> None:
36-
"""
37-
Core `Request` API used for validation.
38-
"""
39-
return self.validate_headers(response)
40-
4135
@property
4236
@abstractmethod
4337
def max_size(self) -> int:
@@ -73,13 +67,12 @@ def generate_block_numbers(self,
7367
def is_numbered(self) -> bool:
7468
return isinstance(self.block_number_or_hash, int)
7569

76-
def validate_headers(self,
77-
headers: Tuple[BlockHeader, ...]) -> None:
78-
if not headers:
70+
def validate_response(self, response: Tuple[BlockHeader, ...]) -> None:
71+
if not response:
7972
# An empty response is always valid
8073
return
8174
elif not self.is_numbered:
82-
first_header = headers[0]
75+
first_header = response[0]
8376
if first_header.hash != self.block_number_or_hash:
8477
raise ValidationError(
8578
"Returned headers cannot be matched to header request. "
@@ -91,7 +84,7 @@ def validate_headers(self,
9184
)
9285

9386
block_numbers: Tuple[BlockNumber, ...] = tuple(
94-
header.block_number for header in headers
87+
header.block_number for header in response
9588
)
9689
return self.validate_sequence(block_numbers)
9790

trinity/protocol/eth/managers.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from eth.rlp.headers import BlockHeader
1515

16-
from p2p.exceptions import ValidationError
16+
from p2p.exceptions import MalformedMessage
1717
from p2p.protocol import (
1818
Command,
1919
)
@@ -100,9 +100,9 @@ async def _normalize_response(self,
100100
msg: Tuple[bytes, ...]
101101
) -> Tuple[Tuple[Hash32, bytes], ...]:
102102
if not isinstance(msg, tuple):
103-
raise ValidationError("Invalid msg, must be tuple of byte strings")
103+
raise MalformedMessage("Invalid msg, must be tuple of byte strings")
104104
elif not all(isinstance(item, bytes) for item in msg):
105-
raise ValidationError("Invalid msg, must be tuple of byte strings")
105+
raise MalformedMessage("Invalid msg, must be tuple of byte strings")
106106

107107
node_keys = await self._run_in_executor(tuple, map(keccak, msg))
108108
return tuple(zip(node_keys, msg))

trinity/protocol/eth/requests.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,11 @@ def __init__(self, node_hashes: Tuple[Hash32, ...]) -> None:
4040
self.node_hashes = node_hashes
4141

4242
def validate_response(self, response: Tuple[Tuple[Hash32, bytes], ...]) -> None:
43-
"""
44-
Core `Request` API used for validation.
45-
"""
46-
return self.validate_node_data(response)
47-
48-
def validate_node_data(self, node_data: Tuple[Tuple[Hash32, bytes], ...]) -> None:
49-
if not node_data:
43+
if not response:
5044
# an empty response is always valid
5145
return
5246

53-
node_keys = tuple(node_key for node_key, node in node_data)
47+
node_keys = tuple(node_key for node_key, node in response)
5448
node_key_set = set(node_keys)
5549

5650
if len(node_keys) != len(node_key_set):

trinity/protocol/les/managers.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from eth.rlp.headers import BlockHeader
1212

1313
from p2p.exceptions import (
14-
ValidationError,
14+
MalformedMessage,
1515
)
1616
from p2p.protocol import (
1717
Command,
@@ -72,11 +72,11 @@ async def _normalize_response(self,
7272
msg: Dict[str, Any]
7373
) -> Tuple[BlockHeader, ...]:
7474
if not isinstance(msg, dict):
75-
raise ValidationError("msg must be a dictionary")
75+
raise MalformedMessage("msg must be a dictionary")
7676
elif 'headers' not in msg:
77-
raise ValidationError("No 'headers' key found in response")
77+
raise MalformedMessage("No 'headers' key found in response")
7878
elif not all(isinstance(item, BlockHeader) for item in msg['headers']):
79-
raise ValidationError(
79+
raise MalformedMessage(
8080
"`headers` key must be a tuple of `BlockHeader` instances"
8181
)
8282

trinity/protocol/les/requests.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
1-
from typing import (
2-
Tuple,
3-
)
4-
51
from eth_typing import BlockIdentifier
62

7-
from eth.rlp.headers import BlockHeader
83

94
from trinity.protocol.common.requests import (
105
BaseHeaderRequest,
@@ -13,9 +8,6 @@
138
from .constants import MAX_HEADERS_FETCH
149

1510

16-
BlockHeaders_R = Tuple[BlockHeader, ...]
17-
18-
1911
class HeaderRequest(BaseHeaderRequest):
2012
request_id: int
2113

trinity/sync/full/state.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,10 @@ async def request_nodes(self, node_keys: Iterable[Hash32]) -> None:
229229
async def _request_and_process_nodes(self, peer: ETHPeer, batch: Tuple[Hash32, ...]) -> None:
230230
self.logger.debug("Requesting %d trie nodes from %s", len(batch), peer)
231231
node_data = await peer.requests.get_node_data(batch)
232-
self.request_tracker.active_requests.pop(peer)
232+
try:
233+
self.request_tracker.active_requests.pop(peer)
234+
except KeyError:
235+
self.logger.warn("Unexpected error removing peer from active requests: %s", peer)
233236

234237
self.logger.debug("Got %d NodeData entries from %s", len(node_data), peer)
235238

@@ -241,7 +244,7 @@ async def _request_and_process_nodes(self, peer: ETHPeer, batch: Tuple[Hash32, .
241244
# check for missing nodes and re-schedule them
242245
missing = set(batch).difference(node_keys)
243246

244-
# TODO: this doesn't actually mean the peer doesn't have them, just
247+
# TODO: this doesn't necessarily mean the peer doesn't have them, just
245248
# that they didn't respond with them this time. We should explore
246249
# alternate ways to do this since a false negative here will result in
247250
# not requesting this node from this peer again.

0 commit comments

Comments
 (0)