Skip to content

Commit 635662b

Browse files
committed
Update subscribe/unsubscribe logic to catch edge cases
1 parent 03e258e commit 635662b

File tree

1 file changed

+13
-3
lines changed

1 file changed

+13
-3
lines changed

async_substrate_interface/async_substrate.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,12 @@ async def retrieve(self, item_id: str) -> Optional[dict]:
985985
return subscription
986986
except asyncio.QueueEmpty:
987987
pass
988+
except KeyError:
989+
logger.debug(
990+
f"Received item {item_id} not in received subscriptions. "
991+
f"This indicates the response of the subscription was inflight when sending "
992+
f"the unsubscribe request."
993+
)
988994
if self._send_recv_task is not None and self._send_recv_task.done():
989995
if not self._send_recv_task.cancelled():
990996
if isinstance((e := self._send_recv_task.exception()), Exception):
@@ -1071,7 +1077,7 @@ def __init__(
10711077
"strict_scale_decode": True,
10721078
}
10731079
self.initialized = False
1074-
self._forgettable_task = None
1080+
self._forgettable_tasks = set()
10751081
self.type_registry = type_registry
10761082
self.type_registry_preset = type_registry_preset
10771083
self.runtime_cache = RuntimeCache()
@@ -1531,11 +1537,13 @@ async def result_handler(
15311537

15321538
if subscription_result is not None:
15331539
# Handler returned end result: unsubscribe from further updates
1534-
self._forgettable_task = asyncio.create_task(
1540+
unsub_task = asyncio.create_task(
15351541
self.rpc_request(
15361542
"state_unsubscribeStorage", [subscription_id]
15371543
)
15381544
)
1545+
self._forgettable_tasks.add(unsub_task)
1546+
unsub_task.add_done_callback(self._forgettable_tasks.discard)
15391547

15401548
return result_found, subscription_result
15411549

@@ -1560,7 +1568,9 @@ async def retrieve_pending_extrinsics(self) -> list:
15601568

15611569
result_data = await self.rpc_request("author_pendingExtrinsics", [])
15621570
if "error" in result_data:
1563-
logger.error(f"Error in retrieving pending extrinsics: {result_data['error']}")
1571+
logger.error(
1572+
f"Error in retrieving pending extrinsics: {result_data['error']}"
1573+
)
15641574
raise SubstrateRequestException(result_data["error"]["message"])
15651575
extrinsics = []
15661576

0 commit comments

Comments
 (0)