Fix handling of asyncio.CancelledError in execution reconciliation #3073
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
The execution reconciliation crashes with
AttributeError: 'CancelledError' object has no attribute 'client_id'whengenerate_mass_status()is cancelled during startup. This prevents the trading node from starting when reconciliation is enabled.Root Cause
In Python 3.8+,
asyncio.CancelledErrorinherits fromBaseExceptioninstead ofException(PEP 3151). The exception check at line 1292 only catchesException, soCancelledErrorpasses through uncaught and crashes when the code attempts to accessmass_status.client_id.Exception hierarchy:
BaseExceptionasyncio.CancelledError← NOT caught byisinstance(x, Exception)ExceptionRuntimeError,ValueError, etc.Solution
Changed the isinstance check from
ExceptiontoBaseExceptionto catch all exception types that can be returned byasyncio.gather(..., return_exceptions=True), includingCancelledError.Before:
After:
Testing
Verified the fix works with:
Impact
generate_mass_status()asyncio.gather()Fixes crash during execution reconciliation startup.