[CIVIS-11753] FIX prevent infinite recursion in retry logic when Retry-After header is missing #524
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.
The retry_request function was repeatedly wrapping the wait strategy each time it was called with the same retrying object. Since APIClient reuses a single tenacity.Retrying instance across all API calls, this created deeply nested wait_for_retry_after_header wrappers. When the API returned an error without a Retry-After header, the fallback chain would recurse infinitely, exceeding Python's recursion limit.
The fix adds a guard to only wrap the wait strategy once, preserving the intended behavior: use Retry-After when present, otherwise fall back to the user's configured wait strategy (exponential backoff by default).
Added test that simulates 1000 consecutive API calls to verify the fix.
🤖 Generated with Claude Code
CHANGELOG.mdat the repo's root level