Skip to content

Commit 4e48d29

Browse files
committed
batch requests now do a normal request if batch size is 1 and wrap normal requests in exponential_retry middleware.
1 parent 6ede3cc commit 4e48d29

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

IceCreamSwapWeb3/BatchRetryMiddleware.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,28 @@
33
from web3.middleware import Web3Middleware
44

55
from IceCreamSwapWeb3 import Web3Advanced
6+
from IceCreamSwapWeb3.EthAdvanced import exponential_retry
67

78

89
class BatchRetryMiddleware(Web3Middleware):
910
_w3: Web3Advanced
1011

1112
def wrap_make_batch_request(self, make_batch_request):
1213
def middleware(requests_info) -> list:
13-
if self._w3.rpc_batch_max_size == 0:
14-
# RPC does not support batch requests at all, splitting batch into single, non batch, requests
15-
return [make_batch_request.__self__.make_request(method, params) for method, params in requests_info]
14+
if len(requests_info) == 0:
15+
# early return if batch to request is empty
16+
return []
17+
18+
if self._w3.rpc_batch_max_size == 0 or len(requests_info) == 1:
19+
# if RPC does not support batch requests or single request in batch, make individual requests
20+
return [
21+
exponential_retry(method)(make_batch_request.__self__.make_request)(
22+
method,
23+
params,
24+
no_retry=not self._w3.should_retry
25+
)
26+
for method, params in requests_info
27+
]
1628

1729
if len(requests_info) > self._w3.rpc_batch_max_size:
1830
response = []
@@ -23,10 +35,7 @@ def middleware(requests_info) -> list:
2335
try:
2436
response = make_batch_request(requests_info)
2537
except Exception as e:
26-
if len(requests_info) == 1:
27-
print(f"batch RPC call with single request got exception {repr(e)}, waiting 1 sec and trying again")
28-
sleep(1)
29-
return middleware(requests_info)
38+
assert len(requests_info) > 1
3039
print(f"batch RPC call with {len(requests_info)} requests got exception {repr(e)}, splitting and retrying")
3140
else:
3241
if len(response) == len(requests_info):
@@ -49,6 +58,8 @@ def middleware(requests_info) -> list:
4958
response[old_idx] = response_new[new_idx]
5059

5160
return response
61+
else:
62+
print(f"made batch request with size {len(requests_info)} but only received {len(response)} results. splitting and retrying.{f' Sample response: {response[0]}'if len(response) != 0 else ''}")
5263
middle = len(requests_info) // 2
5364
return middleware(requests_info[:middle]) + middleware(requests_info[middle:])
5465
return middleware

0 commit comments

Comments
 (0)