add_warning: store exceptions given as args as text, not the exception - #10331
Merged
ThomasWaldmann merged 1 commit intoSep 8, 2026
Merged
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #10331 +/- ##
==========================================
+ Coverage 87.72% 87.80% +0.07%
==========================================
Files 103 103
Lines 18816 18828 +12
Branches 2904 2906 +2
==========================================
+ Hits 16507 16531 +24
+ Misses 1605 1598 -7
+ Partials 704 699 -5 ☔ View full report in Codecov by Harness. |
ThomasWaldmann
force-pushed
the
warnings-no-retain
branch
from
September 6, 2026 14:02
6717775 to
ff8b5ba
Compare
For a BackupWarning, the args of the warning include the caught BackupError exception. Storing that in the global warnings list kept the exception - and thus its traceback and the frames (with all their locals) of the code that failed - alive for the rest of the borg run, one per warning: for a failed file in borg extract, that is the extract_item frame including the chunk data that was being written. borg extract of 300 files of 2.5 MB whose writes all fail peaked at 876 MiB RSS instead of 409 MiB, and on a full disk every remaining file adds another chunk. Store the exception's message text instead, which is what formatting the warning message with the exception gives anyway. Add a regression test (the exception wrapped by a BackupWarning must be freed after print_warning_instance()) and a unit test for the get_ec() warnings logic. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
ThomasWaldmann
force-pushed
the
warnings-no-retain
branch
from
September 8, 2026 17:58
ff8b5ba to
366db25
Compare
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.
What
For a
BackupWarning, the args of the warning include the caughtBackupErrorexception. Storing that in the global warnings list (add_warning()) kept the exception - and thus its traceback and the frames (with all their locals) of the code that failed - alive for the rest of the borg run, one per warning. For a failed file inborg extract, that is theextract_item()frame including the chunkdatathat was being written; on a full disk, every remaining file adds another chunk.Measured with
borg extractof 300 files of 2.5 MB whose writes all fail (ulimit -f, so each write gets EFBIG):How
add_warning()stores exceptions given as args as their message text (str(exc)), which is what formatting the warning message with the exception gives anyway. Everything else (thewarning_infolist,init_ec_warnings(),get_ec()) is unchanged.Tests
print_warning_instance()level: the exception wrapped by theBackupWarningmust be freed afterwards (checked via weakref, after agc.collect()for PyPy). Fails on master, passes here.get_ec()warnings logic (one kind of warning, mixed kinds, error precedence, reset)Note:
1.4-mainthas the sameadd_warning()inhelpers/__init__.py, so the same fix applies there.🤖 Generated with Claude Code