(bugfix) Bound snapshot storage metadata scans
Limit snapshot storage scans recorded by backup workers so very large backup targets cannot make run finalization walk unbounded file trees. Limited scans now record scan_limited, entries_scanned, and max_entries in snapshot storage metadata. Closes #100
This commit is contained in:
@@ -6,7 +6,7 @@ from tempfile import TemporaryDirectory
|
||||
|
||||
from django.test import SimpleTestCase
|
||||
|
||||
from pobsync.run_stats import parse_rsync_stats, tree_usage
|
||||
from pobsync.run_stats import collect_storage_stats, parse_rsync_stats, tree_usage
|
||||
|
||||
|
||||
class RunStatsTests(SimpleTestCase):
|
||||
@@ -58,3 +58,37 @@ total size is 1.50M speedup is 125.00
|
||||
self.assertEqual(stats["hardlinked_files"], 2)
|
||||
self.assertEqual(stats["hardlinked_apparent_size_bytes"], 6)
|
||||
self.assertEqual(stats["hardlink_apparent_ratio"], 1.0)
|
||||
self.assertFalse(stats["scan_limited"])
|
||||
|
||||
def test_tree_usage_can_limit_large_scans(self) -> None:
|
||||
with TemporaryDirectory() as tmp:
|
||||
root = Path(tmp)
|
||||
for index in range(5):
|
||||
(root / f"file-{index}").write_bytes(b"x")
|
||||
|
||||
stats = tree_usage(root, max_entries=2)
|
||||
|
||||
self.assertEqual(stats["files"], 2)
|
||||
self.assertEqual(stats["entries_scanned"], 2)
|
||||
self.assertEqual(stats["max_entries"], 2)
|
||||
self.assertTrue(stats["scan_limited"])
|
||||
self.assertEqual(stats["apparent_size_bytes"], 2)
|
||||
|
||||
def test_collect_storage_stats_marks_limited_snapshot_scan(self) -> None:
|
||||
with TemporaryDirectory() as tmp:
|
||||
root = Path(tmp)
|
||||
snapshot = root / "snapshot"
|
||||
snapshot.mkdir()
|
||||
for index in range(4):
|
||||
(snapshot / f"file-{index}").write_bytes(b"x")
|
||||
|
||||
stats = collect_storage_stats(
|
||||
backup_root=root,
|
||||
snapshot_dir=snapshot,
|
||||
snapshot_max_entries=1,
|
||||
)
|
||||
|
||||
self.assertEqual(stats["snapshot"]["files"], 1)
|
||||
self.assertEqual(stats["snapshot"]["entries_scanned"], 1)
|
||||
self.assertEqual(stats["snapshot"]["max_entries"], 1)
|
||||
self.assertTrue(stats["snapshot"]["scan_limited"])
|
||||
|
||||
Reference in New Issue
Block a user