[PATCH 1/2] gc: write via LocalRepo, not PackWriter

0 views
Skip to first unread message

Rob Browning

unread,
Apr 5, 2025, 4:04:37 PM4/5/25
to bup-...@googlegroups.com
This allows the packwriter to find the proper config, e.g. for
packSizeLimit, and it also prepares for disentangling PackWriter and
PackWriter_Remote (e.g. why does the latter have a repo_dir argument
and call repo()?). Add LocalRepo on_pack_finish to make it possible.

Signed-off-by: Rob Browning <r...@defaultvalue.org>
Tested-by: Rob Browning <r...@defaultvalue.org>
---
lib/bup/gc.py | 17 +++++++++--------
lib/bup/repo/local.py | 24 +++++++++++++++---------
2 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/lib/bup/gc.py b/lib/bup/gc.py
index 8b626f62..409c3458 100644
--- a/lib/bup/gc.py
+++ b/lib/bup/gc.py
@@ -11,6 +11,7 @@ from bup.git import MissingObject, walk_object
from bup.helpers import \
EXIT_FAILURE, log, note_error, progress, qprogress, reprogress
from bup.io import path_msg
+from bup.repo import LocalRepo

# This garbage collector uses a Bloom filter to track the live blobs
# during the mark phase. This means that the collection is
@@ -192,10 +193,10 @@ def sweep(live_objects, live_trees, existing_count, cat_pipe, threshold,
cat_pipe.restart()
stale_packs = []

- writer = git.PackWriter(objcache_maker=lambda _: None,
- compression_level=compression,
- run_midx=False,
- on_pack_finish=remove_stale_packs)
+ repo = LocalRepo(compression_level=compression,
+ objcache_maker=lambda _: None,
+ on_pack_finish=remove_stale_packs,
+ run_midx=False)
try:
# FIXME: sanity check .idx names vs .pack names?
collect_count = 0
@@ -246,7 +247,7 @@ def sweep(live_objects, live_trees, existing_count, cat_pipe, threshold,
if sha in live_in_this_pack:
item_it = cat_pipe.get(hexlify(sha))
_, typ, _ = next(item_it)
- writer.just_write(sha, typ, b''.join(item_it))
+ repo.just_write(sha, typ, b''.join(item_it))
assert idx_name.endswith(b'.idx')
stale_packs.append(idx_name[:-4])

@@ -261,12 +262,12 @@ def sweep(live_objects, live_trees, existing_count, cat_pipe, threshold,

except BaseException as ex:
with pending_raise(ex):
- writer.abort()
+ repo.abort_writing()
finally:
# This will finally run midx.
- writer.close()
+ repo.close()

- remove_stale_packs(None) # In case we didn't write to the writer.
+ remove_stale_packs(None) # In case we didn't write to the repo.

if verbosity:
log('discarded %d%% of objects\n'
diff --git a/lib/bup/repo/local.py b/lib/bup/repo/local.py
index 89104d15..c6dc024b 100644
--- a/lib/bup/repo/local.py
+++ b/lib/bup/repo/local.py
@@ -6,16 +6,19 @@ from functools import partial

from bup import git, vfs
from bup.config import ConfigError
+from bup.git import PackWriter
from bup.repo.base import RepoProtocol


class LocalRepo(RepoProtocol):
def __init__(self, repo_dir=None, compression_level=None,
max_pack_size=None, max_pack_objects=None,
- server=False):
+ server=False, objcache_maker=None, run_midx=None,
+ on_pack_finish=None):
self.closed = True
self.compression_level = compression_level
self.max_pack_objects = max_pack_objects
+ self._on_pack_finish = on_pack_finish
self._packwriter = None
self.repo_dir = realpath(repo_dir or git.guess_repo())
self.write_symlink = self.write_data
@@ -25,11 +28,13 @@ class LocalRepo(RepoProtocol):
deduplicate = self.config_get(b'bup.server.deduplicate-writes', opttype='bool')
if server and deduplicate == False:
# don't make midx files
+ assert objcache_maker is None
+ assert run_midx is None
self.objcache_maker = lambda _: None
self.run_midx = False
else:
- self.objcache_maker = None
- self.run_midx = True
+ self.objcache_maker = objcache_maker
+ self.run_midx = True if run_midx is None else run_midx
self.max_pack_size = max_pack_size \
or self.config_get(b'pack.packSizeLimit', opttype='int')
super()._validate_init()
@@ -73,12 +78,13 @@ class LocalRepo(RepoProtocol):

def _ensure_packwriter(self):
if not self._packwriter:
- self._packwriter = git.PackWriter(repo_dir=self.repo_dir,
- compression_level=self.compression_level,
- max_pack_size=self.max_pack_size,
- max_pack_objects=self.max_pack_objects,
- objcache_maker=self.objcache_maker,
- run_midx=self.run_midx)
+ self._packwriter = PackWriter(repo_dir=self.repo_dir,
+ compression_level=self.compression_level,
+ max_pack_size=self.max_pack_size,
+ max_pack_objects=self.max_pack_objects,
+ objcache_maker=self.objcache_maker,
+ on_pack_finish=self._on_pack_finish,
+ run_midx=self.run_midx)

def update_ref(self, refname, newval, oldval):
self.finish_writing()
--
2.47.2

Reply all
Reply to author
Forward
0 new messages