Skip to content

jadepy: stop reading and retrying closed TCP streams - #347

Open
agammann wants to merge 1 commit into
Blockstream:masterfrom
agammann:fix/tcp-eof
Open

agammann wants to merge 1 commit into
Blockstream:masterfrom
agammann:fix/tcp-eof

Conversation

@agammann

Copy link
Copy Markdown

When a TCP peer closes before a requested read is complete, recv returns empty bytes immediately. JadeTCPImpl.read keeps appending those bytes forever, so even a configured socket timeout cannot end the read. This can hang emulator clients after a disconnect or truncated response.

Stop accumulating bytes at EOF, remember the closed stream until reconnect, and return any bytes already received. Also stop read_response(long_timeout=True) from retrying CBOR EOF on a known closed TCP stream. Open connections retain the existing long timeout behavior, and drain can finish at EOF.

Validation: python -m unittest -v test_jade_tcp passes all 10 tests, covering clean and partial EOF, fragmented reads, zero length reads, socket timeouts, CBOR EOF with both timeout modes, drain, reconnect, and retries on an open stream. The EOF regression cases failed against the original implementation. A separate real localhost TCP reproduction also confirmed that reads after both immediate and partial disconnects now complete; before the fix both exceeded a 750 ms watchdog despite a 100 ms socket timeout.

pycodestyle --max-line-length=100 passes for all three changed Python files, and git diff --check passes. Tests ran on Ubuntu/WSL with Python 3.14.4 and cbor2 5.9.0. No firmware build, hardware, BLE, or full emulator RPC suite was exercised.

The standalone unittest module runs without the device-dependent tests/conftest.py setup.

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