Skip to content

Commit 22bd5ec

Browse files
committed
batch retry and splitting now is more sophisticated, where individual failed calls are detected and retried.
1 parent 270b5b4 commit 22bd5ec

File tree

1 file changed

+27
-4
lines changed

1 file changed

+27
-4
lines changed

IceCreamSwapWeb3/BatchRetryMiddleware.py

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from time import sleep
2+
13
from web3.middleware import Web3Middleware
24

35
from IceCreamSwapWeb3 import Web3Advanced
@@ -16,12 +18,33 @@ def middleware(requests_info) -> list:
1618

1719
try:
1820
response = make_batch_request(requests_info)
19-
if len(response) == len(requests_info):
20-
return response
21-
except Exception:
21+
except Exception as e:
2222
if len(requests_info) == 1:
23-
raise
23+
print(f"batch RPC call with single request got exception {repr(e)}, waiting 1 sec and trying again")
24+
sleep(1)
25+
return middleware(requests_info)
26+
print(f"batch RPC call with {len(requests_info)} requests got exception {repr(e)}, splitting and retrying")
27+
else:
28+
if len(response) == len(requests_info):
29+
# find individual failed requests
30+
requests_retry = []
31+
request_indexes: list[tuple[int, int]] = []
32+
for i, (request_single, response_single) in enumerate(zip(requests_info, response)):
33+
if "error" in response_single or response_single["result"] is None:
34+
request_indexes.append((i, len(requests_retry)))
35+
requests_retry.append(request_single)
36+
37+
if len(requests_retry) != 0:
38+
# retry failed requests
39+
print(f"{len(requests_retry)}/{len(requests_info)} requests in batch failed, retrying. Example response: {response[request_indexes[0][0]]}")
40+
if len(requests_retry) == len(requests_info):
41+
# all failed, let's wait a moment before retrying
42+
sleep(1)
43+
response_new = middleware(requests_retry)
44+
for old_idx, new_idx in request_indexes:
45+
response[old_idx] = response_new[new_idx]
2446

47+
return response
2548
middle = len(requests_info) // 2
2649
return middleware(requests_info[:middle]) + middleware(requests_info[middle:])
2750
return middleware

0 commit comments

Comments
 (0)