فهرست منبع

Fix automated tests and update NEWS (#1206).

Dan Helfman 3 روز پیش
والد
کامیت
54d955bc95
4فایلهای تغییر یافته به همراه11 افزوده شده و 29 حذف شده
  1. 4 2
      NEWS
  2. 3 3
      borgmatic/hooks/data_source/btrfs.py
  3. 0 1
      tests/integration/hooks/data_source/test_btrfs.py
  4. 4 23
      tests/unit/hooks/data_source/test_btrfs.py

+ 4 - 2
NEWS

@@ -2,6 +2,8 @@
  * #1054: Allow the Btrfs hook to create and delete snapshots even when running
  * #1054: Allow the Btrfs hook to create and delete snapshots even when running
    as a non-root user. See the documentation for more information:
    as a non-root user. See the documentation for more information:
    https://torsion.org/borgmatic/reference/configuration/data-sources/btrfs/#non-root-user
    https://torsion.org/borgmatic/reference/configuration/data-sources/btrfs/#non-root-user
+ * #1122: To prevent the user from inadvertently excluding the "bootstrap" action's manifest, always
+   error and exit when the borgmatic runtime directory overlaps with the configured excludes.
  * #1179: Add a "file_list_format" option for setting the "list" action's output format and an
  * #1179: Add a "file_list_format" option for setting the "list" action's output format and an
    "archive_list_format" option for setting the "repo-list" action's format.
    "archive_list_format" option for setting the "repo-list" action's format.
  * #1192: Fix for over-aggressive deduplication of source directories that contain the borgmatic
  * #1192: Fix for over-aggressive deduplication of source directories that contain the borgmatic
@@ -24,8 +26,8 @@
  * #1203: Fix that errors and exits when the borgmatic runtime directory is partially excluded by
  * #1203: Fix that errors and exits when the borgmatic runtime directory is partially excluded by
    configured excludes. Previously, borgmatic only errored when the runtime directory was completely
    configured excludes. Previously, borgmatic only errored when the runtime directory was completely
    excluded.
    excluded.
- * #1122: To prevent the user from inadvertently excluding the "bootstrap" action's manifest, always
-   error and exit when the borgmatic runtime directory overlaps with the configured excludes.
+ * #1206: Adjust Btrfs snapshot paths so that Borg 1.x gets file cache hits when backing them up,
+   improving performance.
  * Update the sample systemd timer with a shorter random delay when catching up on a missed run.
  * Update the sample systemd timer with a shorter random delay when catching up on a missed run.
 
 
 2.0.12
 2.0.12

+ 3 - 3
borgmatic/hooks/data_source/btrfs.py

@@ -193,16 +193,16 @@ def make_snapshot_exclude_pattern(subvolume_path):  # pragma: no cover
     directory within the snapshot itself. For instance, if you have a Btrfs subvolume at /mnt and
     directory within the snapshot itself. For instance, if you have a Btrfs subvolume at /mnt and
     make a snapshot of it at:
     make a snapshot of it at:
 
 
-        /mnt/.borgmatic-snapshot-1234/mnt
+        /mnt/.borgmatic-snapshot/mnt
 
 
     ... then the snapshot itself will have an empty directory at:
     ... then the snapshot itself will have an empty directory at:
 
 
-        /mnt/.borgmatic-snapshot-1234/mnt/.borgmatic-snapshot-1234
+        /mnt/.borgmatic-snapshot/mnt/.borgmatic-snapshot
 
 
     So to prevent that from ending up in the Borg archive, this function produces an exclude pattern
     So to prevent that from ending up in the Borg archive, this function produces an exclude pattern
     to exclude that path.
     to exclude that path.
     '''
     '''
-    snapshot_directory = f'{BORGMATIC_SNAPSHOT_PREFIX}{os.getpid()}'
+    snapshot_directory = f'{BORGMATIC_SNAPSHOT_PREFIX}'
 
 
     return borgmatic.borg.pattern.Pattern(
     return borgmatic.borg.pattern.Pattern(
         os.path.join(
         os.path.join(

+ 0 - 1
tests/integration/hooks/data_source/test_btrfs.py

@@ -24,7 +24,6 @@ def test_dump_data_sources_snapshots_each_subvolume_and_updates_patterns():
             module.Subvolume('/mnt/subvol2', contained_patterns=(Pattern('/mnt/subvol2'),)),
             module.Subvolume('/mnt/subvol2', contained_patterns=(Pattern('/mnt/subvol2'),)),
         ),
         ),
     )
     )
-    flexmock(module.os).should_receive('getpid').and_return(1234)
     flexmock(module).should_receive('snapshot_subvolume').with_args(
     flexmock(module).should_receive('snapshot_subvolume').with_args(
         'btrfs',
         'btrfs',
         '/mnt/subvol1',
         '/mnt/subvol1',

+ 4 - 23
tests/unit/hooks/data_source/test_btrfs.py

@@ -339,8 +339,6 @@ def test_make_snapshot_path_includes_stripped_subvolume_path(
     subvolume_path,
     subvolume_path,
     expected_snapshot_path,
     expected_snapshot_path,
 ):
 ):
-    flexmock(module.os).should_receive('getpid').and_return(1234)
-
     assert module.make_snapshot_path(subvolume_path) == expected_snapshot_path
     assert module.make_snapshot_path(subvolume_path) == expected_snapshot_path
 
 
 
 
@@ -385,8 +383,6 @@ def test_make_borg_snapshot_pattern_includes_slashdot_hack_and_stripped_pattern_
     pattern,
     pattern,
     expected_pattern,
     expected_pattern,
 ):
 ):
-    flexmock(module.os).should_receive('getpid').and_return(1234)
-
     assert module.make_borg_snapshot_pattern(subvolume_path, pattern) == expected_pattern
     assert module.make_borg_snapshot_pattern(subvolume_path, pattern) == expected_pattern
 
 
 
 
@@ -704,16 +700,12 @@ def test_remove_data_source_dumps_deletes_snapshots():
     flexmock(module.glob).should_receive('glob').with_args(
     flexmock(module.glob).should_receive('glob').with_args(
         '/mnt/subvol1/.borgmatic-*/mnt/subvol1',
         '/mnt/subvol1/.borgmatic-*/mnt/subvol1',
     ).and_return(
     ).and_return(
-        (
-            '/mnt/subvol1/.borgmatic-snapshot/mnt/subvol1',
-        ),
+        ('/mnt/subvol1/.borgmatic-snapshot/mnt/subvol1',),
     )
     )
     flexmock(module.glob).should_receive('glob').with_args(
     flexmock(module.glob).should_receive('glob').with_args(
         '/mnt/subvol2/.borgmatic-*/mnt/subvol2',
         '/mnt/subvol2/.borgmatic-*/mnt/subvol2',
     ).and_return(
     ).and_return(
-        (
-            '/mnt/subvol2/.borgmatic-snapshot/mnt/subvol2',
-        ),
+        ('/mnt/subvol2/.borgmatic-snapshot/mnt/subvol2',),
     )
     )
     flexmock(module.os.path).should_receive('isdir').with_args(
     flexmock(module.os.path).should_receive('isdir').with_args(
         '/mnt/subvol1/.borgmatic-snapshot/mnt/subvol1',
         '/mnt/subvol1/.borgmatic-snapshot/mnt/subvol1',
@@ -1089,26 +1081,15 @@ def test_remove_data_source_dumps_with_root_subvolume_skips_duplicate_removal():
         ('/.borgmatic-snapshot', '/.borgmatic-snapshot'),
         ('/.borgmatic-snapshot', '/.borgmatic-snapshot'),
     )
     )
 
 
-    flexmock(module.os.path).should_receive('isdir').with_args(
-        '/.borgmatic-snapshot'
-    ).and_return(
-        True,
-    ).and_return(False)
-    flexmock(module.os.path).should_receive('isdir').with_args(
-        '/.borgmatic-snapshot'
-    ).and_return(
-        True,
+    flexmock(module.os.path).should_receive('isdir').with_args('/.borgmatic-snapshot').and_return(
+        True
     ).and_return(False)
     ).and_return(False)
 
 
-    flexmock(module).should_receive('delete_snapshot').with_args(
-        'btrfs', '/.borgmatic-snapshot'
-    ).once()
     flexmock(module).should_receive('delete_snapshot').with_args(
     flexmock(module).should_receive('delete_snapshot').with_args(
         'btrfs', '/.borgmatic-snapshot'
         'btrfs', '/.borgmatic-snapshot'
     ).once()
     ).once()
 
 
     flexmock(module.os.path).should_receive('isdir').with_args('').and_return(False)
     flexmock(module.os.path).should_receive('isdir').with_args('').and_return(False)
-
     flexmock(module.shutil).should_receive('rmtree').never()
     flexmock(module.shutil).should_receive('rmtree').never()
 
 
     module.remove_data_source_dumps(
     module.remove_data_source_dumps(