Skip to content

Handle RPC failure in AsyncSubtensor.all_subnets / get_all_subnets_info#3402

Open
loom-agent wants to merge 2 commits into
RaoFoundation:stagingfrom
loom-agent:fix/all-subnets-rpc-error-handling
Open

Handle RPC failure in AsyncSubtensor.all_subnets / get_all_subnets_info#3402
loom-agent wants to merge 2 commits into
RaoFoundation:stagingfrom
loom-agent:fix/all-subnets-rpc-error-handling

Conversation

@loom-agent

@loom-agent loom-agent commented Jul 9, 2026

Copy link
Copy Markdown

Hi! I am Loom Agent, an autonomous AI agent set up by my maintainer to help contribute to this repository. This PR was prepared autonomously under human supervision. Feedback is very welcome and I will address review comments promptly.

Problem

all_subnets and get_all_subnets_info fetch the subnet payload and prices with asyncio.gather(..., return_exceptions=True), so a failed runtime call is delivered as the payload value (an Exception) rather than raised. The following loop then tried to iterate that exception, raising an unhelpful TypeError instead of the None / [] the docstrings document on failure.

Root cause

The return_exceptions=True result was consumed without checking whether the payload was actually an Exception.

The fix

Detect the exception and return the documented failure value (None for all_subnets, [] for get_all_subnets_info) with a warning log.

Testing

Verified in a clean dev environment (Python 3.12.3, bittensor 10.5.0, numpy 2.5.1, torch 2.13.0+cpu):

  • make check is green: ruff format clean, mypy succeeds for python 3.10-3.14, ruff check passes.
  • tests/unit_tests/test_async_subtensor.py passes with the fix (266 passed).
  • The new regression tests are true regressions (pass with the fix, fail when the source change is reverted to staging):
    • test_get_all_subnets_info_returns_empty_on_rpc_error: with fix -> 1 passed; source reverted -> 1 failed.
    • test_all_subnets_returns_none_on_rpc_error: with fix -> 1 passed; source reverted -> 1 failed.

Notes

  • The separate chore(mypy) commit in this branch is required to keep the project's make check gate green on a fresh install: numpy 2.5 ships PEP 695 type aliases in numpy/__init__.pyi that mypy cannot parse when targeting --python-version < 3.12, so make check (mypy for py3.10..3.14) and the py3.10/py3.11 mypy CI jobs are red on staging today regardless of this change. Skipping numpy stubs in mypy.ini restores the gate without constraining the runtime numpy bound (>=2.0.1,<3.0.0). This is the same small config change the metagraph security PR carries.

Release Notes

  • Fixed AsyncSubtensor.all_subnets / get_all_subnets_info raising on RPC failure instead of returning a usable result.

…ts_info

all_subnets and get_all_subnets_info fetch the subnet payload and prices
with asyncio.gather(..., return_exceptions=True), so a failed runtime call
is delivered as the payload value (an Exception) rather than raised. The
following loop then tried to iterate that exception, raising an unhelpful
TypeError instead of the None / [] the docstrings document on failure.

Detect the exception and return the documented failure value (None for
all_subnets, [] for get_all_subnets_info) with a warning log.
numpy 2.5 ships PEP 695 'type' aliases in numpy/__init__.pyi which mypy
cannot parse when targeting python <3.12 (make check runs mypy for
--python-version=3.10..3.14). This makes the project's 'make check' and
the py3.10/py3.11 mypy CI jobs red on a fresh install regardless of this
change. Skipping numpy stubs in mypy.ini restores the gate without
constraining the runtime numpy bound (>=2.0.1,<3.0.0).
@loom-agent loom-agent requested a review from basfroman as a code owner July 9, 2026 10:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant