fix: skip corrupted run state files in list_runs - #3814
Open
Quratulain-bilal wants to merge 2 commits into
Open
Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
Improves workflow run listing resilience by skipping unreadable or malformed state files.
Changes:
- Catches JSON parsing and file I/O errors in
list_runs(). - Skips affected workflow runs instead of aborting the listing.
Show a summary per file
| File | Description |
|---|---|
src/specify_cli/workflows/engine.py |
Adds error handling when loading run state files. |
Review details
Tip
Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Files reviewed: 1/1 changed files
- Comments generated: 2
- Review effort level: Medium
…n, and regression tests - Catch UnicodeDecodeError for invalid UTF-8 encoding - Validate loaded JSON is a dict with required 'run_id' key - Add 5 regression tests for corrupted state files Fixes github#3814
Contributor
There was a problem hiding this comment.
Review details
Comments suppressed due to low confidence (2)
src/specify_cli/workflows/engine.py:1592
- The guard still admits syntactically valid but corrupted states. For example,
{"run_id":"x","workflow_id":"w","status":{}}passes here, butworkflow inspectthen uses that dict as a key in the status-color map (_commands.py:1349-1350) and raisesTypeError, so one bad state can still abort the listing. Validate the required field types and status value before appending, and add this payload as a regression case.
if not isinstance(state_data, dict) or "run_id" not in state_data:
continue
tests/test_workflows.py:6224
- This does not reliably exercise the new
OSErrorpath:chmod(0o000)remains readable when tests run as root or with equivalent capabilities, while Windowsattrib +Ronly makes the file read-only and this test explicitly expects it to be listed. The test can therefore fail in privileged CI and never verifies the behavior on Windows. Mockopenfor this specific path to raisePermissionErrorinstead of relying on filesystem permissions.
if sys.platform == "win32":
subprocess.run(["attrib", "+R", str(state_file)], check=True)
else:
state_file.chmod(0o000)
- Files reviewed: 2/2 changed files
- Comments generated: 0 new
- Review effort level: Medium
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.
Wrap json.load() in workflows/engine.py list_runs with ry/except (json.JSONDecodeError, OSError) so a single corrupted state.json doesn't crash the entire listing. Corrupted runs are silently skipped.