Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <psteinhardt@gitlab.com>2022-02-04 12:36:24 +0300
committerPatrick Steinhardt <psteinhardt@gitlab.com>2022-02-09 10:30:08 +0300
commit306761f0d4feccfcf5f62bcc69d09194159b37cb (patch)
treec6a2b653c8ed00302457a973325f046ee137c2e5
parent85dad6b3dcd4baf263b9f4d35b05259ee52916df (diff)
repository: Make repacking of repositories self-contained
While we do have a `repack()` function which handles repacking of repositories, this function is not self-contained: callers need to pass additional Git options to request a full repack. This makes it hard to reuse the logic in other locations where we potentially want to do a full repakc, as well. Refactor the code to move all repacking logic into `repack()` itself. Callers can decide whether they want to do a full or partial repack by setting the respective parameters in a new config structure.
-rw-r--r--internal/gitaly/service/repository/repack.go43
1 files changed, 32 insertions, 11 deletions
diff --git a/internal/gitaly/service/repository/repack.go b/internal/gitaly/service/repository/repack.go
index 280fb6186..a3f428650 100644
--- a/internal/gitaly/service/repository/repack.go
+++ b/internal/gitaly/service/repository/repack.go
@@ -36,31 +36,52 @@ func log2Threads(numCPUs int) git.ValueFlag {
func (s *server) RepackFull(ctx context.Context, in *gitalypb.RepackFullRequest) (*gitalypb.RepackFullResponse, error) {
repo := s.localrepo(in.GetRepository())
- options := []git.Option{
- git.Flag{Name: "-A"},
- git.Flag{Name: "--pack-kept-objects"},
- git.Flag{Name: "-l"},
- log2Threads(runtime.NumCPU()),
+ cfg := repackCommandConfig{
+ fullRepack: true,
+ writeBitmap: in.GetCreateBitmap(),
}
- if err := repack(ctx, repo, in.GetCreateBitmap(), options...); err != nil {
+
+ if err := repack(ctx, repo, cfg); err != nil {
return nil, helper.ErrInternal(err)
}
+
return &gitalypb.RepackFullResponse{}, nil
}
func (s *server) RepackIncremental(ctx context.Context, in *gitalypb.RepackIncrementalRequest) (*gitalypb.RepackIncrementalResponse, error) {
repo := s.localrepo(in.GetRepository())
- if err := repack(ctx, repo, false); err != nil {
- return nil, helper.ErrInternal(err)
+ cfg := repackCommandConfig{
+ fullRepack: false,
+ writeBitmap: false,
+ }
+
+ if err := repack(ctx, repo, cfg); err != nil {
+ return nil, err
}
+
return &gitalypb.RepackIncrementalResponse{}, nil
}
-func repack(ctx context.Context, repo *localrepo.Repo, bitmap bool, args ...git.Option) error {
+type repackCommandConfig struct {
+ fullRepack bool
+ writeBitmap bool
+}
+
+func repack(ctx context.Context, repo *localrepo.Repo, cfg repackCommandConfig) error {
+ var options []git.Option
+ if cfg.fullRepack {
+ options = append(options,
+ git.Flag{Name: "-A"},
+ git.Flag{Name: "--pack-kept-objects"},
+ git.Flag{Name: "-l"},
+ log2Threads(runtime.NumCPU()),
+ )
+ }
+
if err := repo.ExecAndWait(ctx, git.SubCmd{
Name: "repack",
- Flags: append([]git.Option{git.Flag{Name: "-d"}}, args...),
- }, git.WithConfig(repackConfig(ctx, bitmap)...)); err != nil {
+ Flags: append([]git.Option{git.Flag{Name: "-d"}}, options...),
+ }, git.WithConfig(repackConfig(ctx, cfg.writeBitmap)...)); err != nil {
return err
}