Skip to content

Commit 6ef9efd

Browse files
committed
Add archive node for RetrySyncSubstrate
1 parent 8b7eb0c commit 6ef9efd

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

async_substrate_interface/substrate_addons.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,17 @@ def __init__(
117117
max_retries: int = 5,
118118
retry_timeout: float = 60.0,
119119
_mock: bool = False,
120+
archive_nodes: Optional[list[str]] = None,
120121
):
121122
fallback_chains = fallback_chains or []
122123
self.fallback_chains = (
123124
iter(fallback_chains)
124125
if not retry_forever
125126
else cycle(fallback_chains + [url])
126127
)
128+
self.archive_nodes = (
129+
iter(archive_nodes) if not retry_forever else cycle(archive_nodes)
130+
)
127131
self.use_remote_preset = use_remote_preset
128132
self.chain_name = chain_name
129133
self._mock = _mock
@@ -174,20 +178,32 @@ def _retry(self, method, *args, **kwargs):
174178
EOFError,
175179
ConnectionClosed,
176180
TimeoutError,
181+
socket.gaierror,
182+
StateDiscardedError,
177183
) as e:
184+
use_archive = isinstance(e, StateDiscardedError)
178185
try:
179-
self._reinstantiate_substrate(e)
186+
self._reinstantiate_substrate(e, use_archive=use_archive)
180187
return method_(*args, **kwargs)
181188
except StopIteration:
182189
logger.error(
183190
f"Max retries exceeded with {self.url}. No more fallback chains."
184191
)
185192
raise MaxRetriesExceeded
186193

187-
def _reinstantiate_substrate(self, e: Optional[Exception] = None) -> None:
188-
next_network = next(self.fallback_chains)
194+
def _reinstantiate_substrate(
195+
self, e: Optional[Exception] = None, use_archive: bool = False
196+
) -> None:
197+
if use_archive:
198+
bh = getattr(e, "block_hash", "Unknown Block Hash")
199+
logger.info(
200+
f"Attempt made to {bh} failed for state discarded. Attempting to switch to archive node."
201+
)
202+
next_network = next(self.archive_nodes)
203+
else:
204+
next_network = next(self.fallback_chains)
189205
self.ws.close()
190-
if e.__class__ == MaxRetriesExceeded:
206+
if isinstance(e, MaxRetriesExceeded):
191207
logger.error(
192208
f"Max retries exceeded with {self.url}. Retrying with {next_network}."
193209
)
@@ -287,7 +303,7 @@ async def _reinstantiate_substrate(
287303
next_network = next(self.archive_nodes)
288304
else:
289305
next_network = next(self.fallback_chains)
290-
if e.__class__ == MaxRetriesExceeded:
306+
if isinstance(e, MaxRetriesExceeded):
291307
logger.error(
292308
f"Max retries exceeded with {self.url}. Retrying with {next_network}."
293309
)

0 commit comments

Comments
 (0)