Skip to content

Commit 18ce47c

Browse files
authored
Merge pull request #211 from opentensor/chore/thewhaleking/more-efficient-query-map
more efficient query map
2 parents 95b96f5 + 3aa45fa commit 18ce47c

File tree

4 files changed

+37
-26
lines changed

4 files changed

+37
-26
lines changed

async_substrate_interface/async_substrate.py

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
RuntimeCache,
5656
SubstrateMixin,
5757
Preprocessed,
58+
RequestResults,
5859
)
5960
from async_substrate_interface.utils import (
6061
hex_to_bytes,
@@ -2391,7 +2392,7 @@ async def _make_rpc_request(
23912392
attempt: int = 1,
23922393
runtime: Optional[Runtime] = None,
23932394
force_legacy_decode: bool = False,
2394-
) -> RequestManager.RequestResults:
2395+
) -> RequestResults:
23952396
request_manager = RequestManager(payloads)
23962397

23972398
subscription_added = False
@@ -3669,34 +3670,40 @@ async def query_map(
36693670
self.decode_ss58,
36703671
)
36713672
else:
3672-
all_responses = []
36733673
page_batches = [
36743674
result_keys[i : i + page_size]
36753675
for i in range(0, len(result_keys), page_size)
36763676
]
36773677
changes = []
3678-
for batch_group in [
3679-
# run five concurrent batch pulls; could go higher, but it's good to be a good citizens
3680-
# of the ecosystem
3681-
page_batches[i : i + 5]
3682-
for i in range(0, len(page_batches), 5)
3683-
]:
3684-
all_responses.extend(
3685-
await asyncio.gather(
3686-
*[
3687-
self.rpc_request(
3688-
method="state_queryStorageAt",
3689-
params=[batch_keys, block_hash],
3690-
runtime=runtime,
3691-
)
3692-
for batch_keys in batch_group
3693-
]
3678+
payloads = []
3679+
for idx, page_batch in enumerate(page_batches):
3680+
payloads.append(
3681+
self.make_payload(
3682+
str(idx), "state_queryStorageAt", [page_batch, block_hash]
36943683
)
36953684
)
3696-
for response in all_responses:
3697-
for result_group in response["result"]:
3698-
changes.extend(result_group["changes"])
3699-
3685+
results: RequestResults = await self._make_rpc_request(
3686+
payloads, runtime=runtime
3687+
)
3688+
for result in results.values():
3689+
res = result[0]
3690+
if "error" in res:
3691+
err_msg = res["error"]["message"]
3692+
if (
3693+
"Client error: Api called for an unknown Block: State already discarded"
3694+
in err_msg
3695+
):
3696+
bh = err_msg.split("State already discarded for ")[
3697+
1
3698+
].strip()
3699+
raise StateDiscardedError(bh)
3700+
else:
3701+
raise SubstrateRequestException(err_msg)
3702+
elif "result" not in res:
3703+
raise SubstrateRequestException(res)
3704+
else:
3705+
for result_group in res["result"]:
3706+
changes.extend(result_group["changes"])
37003707
result = decode_query_map(
37013708
changes,
37023709
prefix,

async_substrate_interface/sync_substrate.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
RequestManager,
3535
Preprocessed,
3636
ScaleObj,
37+
RequestResults,
3738
)
3839
from async_substrate_interface.utils import (
3940
hex_to_bytes,
@@ -1892,7 +1893,7 @@ def _make_rpc_request(
18921893
result_handler: Optional[ResultHandler] = None,
18931894
attempt: int = 1,
18941895
force_legacy_decode: bool = False,
1895-
) -> RequestManager.RequestResults:
1896+
) -> RequestResults:
18961897
request_manager = RequestManager(payloads)
18971898
_received = {}
18981899
subscription_added = False

async_substrate_interface/types.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,9 +369,10 @@ def resolve_type_definition(type_id_):
369369
self.type_id_to_name = type_id_to_name
370370

371371

372-
class RequestManager:
373-
RequestResults = dict[Union[str, int], list[Union[ScaleType, dict]]]
372+
RequestResults = dict[Union[str, int], list[Union[ScaleType, dict]]]
373+
374374

375+
class RequestManager:
375376
def __init__(self, payloads):
376377
self.response_map = {}
377378
self.responses = defaultdict(

async_substrate_interface/utils/decoding.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,9 @@ def concat_hash_len(key_hasher: str) -> int:
113113

114114
for item in result_group_changes:
115115
pre_decoded_keys.append(bytes.fromhex(item[0][len(prefix) :]))
116-
pre_decoded_values.append(hex_to_bytes_(item[1]))
116+
pre_decoded_values.append(
117+
hex_to_bytes_(item[1]) if item[1] is not None else b""
118+
)
117119
all_decoded = _decode_scale_list_with_runtime(
118120
pre_decoded_key_types + pre_decoded_value_types,
119121
pre_decoded_keys + pre_decoded_values,

0 commit comments

Comments
 (0)