Repository navigation
fix: CLIJSONDecodeError survives pickle and copy - #1494
Open
Sathwik-giddi wants to merge 1 commit into
Open
Sathwik-giddi wants to merge 1 commit into
Sathwik-giddi wants to merge 1 commit into
Conversation
The default exception reconstruction protocol calls type(e)(*e.args), but e.args holds only the formatted message — one argument short of the (line, original_error) constructor — so pickle, copy, and therefore multiprocessing/ProcessPoolExecutor fail with a TypeError and take down the pool. Add __reduce__ that reconstructs from the original inputs, matching the protocol ResultError already uses. Fixes anthropics#1394
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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
CLIJSONDecodeErrorcannot be reconstructed bypickleorcopy, so any multiprocessing boundary it crosses (ProcessPoolExecutor) breaks withBrokenProcessPoolinstead of surfacing the error.The default exception reconstruction protocol calls
type(e)(*e.args), bute.argsholds only the formatted message — one argument short of the(line, original_error)constructor.Fix
Add a
__reduce__that reconstructs from(self.line, self.original_error), mirroring the protocolResultErroralready documents and its existing testtest_result_error_survives_pickle_and_copy. This keeps the signature intact and avoids a doubled message (Failed to decode JSON: Failed to decode JSON: ...) that makingoriginal_erroroptional alone would produce, sinceargsholds the already-formatted text.Testing
test_json_decode_error_survives_pickle_and_copyasserts pickle/copy round-trips preserveline, the original error type, and the message (with a guard against doubling).ruff check,ruff format,mypyclean; full suite passes.Fixes #1394