diff options
author | Paul Okstad <pokstad@gitlab.com> | 2019-11-01 18:36:14 +0300 |
---|---|---|
committer | Paul Okstad <pokstad@gitlab.com> | 2019-11-01 18:36:14 +0300 |
commit | 226eef60665b0929bd3db358c81018c03f45fb29 (patch) | |
tree | baa5d55bc3e0c19859e8589756a498d2603a3d2f /internal/git | |
parent | 2d465eb4419d862f34f2720381ec6ec50b93842a (diff) | |
parent | 7060c8827906d8248b05eee8f3f9562b0641c07f (diff) |
Merge branch 'jv-count-dangling' into 'master'
Count dangling refs before/after FetchIntoObjectPool
See merge request gitlab-org/gitaly!1585
Diffstat (limited to 'internal/git')
-rw-r--r-- | internal/git/objectpool/fetch.go | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/internal/git/objectpool/fetch.go b/internal/git/objectpool/fetch.go index a5240fbfd..6230bb049 100644 --- a/internal/git/objectpool/fetch.go +++ b/internal/git/objectpool/fetch.go @@ -6,6 +6,7 @@ import ( "fmt" "strings" + grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" "gitlab.com/gitlab-org/gitaly/internal/command" "gitlab.com/gitlab-org/gitaly/internal/git" "gitlab.com/gitlab-org/gitaly/internal/git/repository" @@ -65,6 +66,10 @@ func (o *ObjectPool) FetchFromOrigin(ctx context.Context, origin *gitalypb.Repos return err } + if err := logDanglingRefs(ctx, o, "before fetch"); err != nil { + return err + } + refSpec := fmt.Sprintf("+refs/*:%s/*", sourceRefNamespace) fetchCmd, err := git.Command(ctx, o, "fetch", "--quiet", sourceRemote, refSpec) if err != nil { @@ -79,6 +84,10 @@ func (o *ObjectPool) FetchFromOrigin(ctx context.Context, origin *gitalypb.Repos return err } + if err := logDanglingRefs(ctx, o, "after fetch"); err != nil { + return err + } + packRefs, err := git.Command(ctx, o, "pack-refs", "--all") if err != nil { return err @@ -157,3 +166,37 @@ func repackPool(ctx context.Context, pool repository.GitRepo) error { return nil } + +func logDanglingRefs(ctx context.Context, pool repository.GitRepo, when string) error { + forEachRef, err := git.SafeCmd(ctx, pool, nil, git.SubCmd{ + Name: "for-each-ref", + Flags: []git.Option{git.Flag{"--format=%(objecttype)"}}, + Args: []string{danglingObjectNamespace}, + }) + if err != nil { + return err + } + + counts := make(map[string]int) + scanner := bufio.NewScanner(forEachRef) + for scanner.Scan() { + counts[scanner.Text()]++ + } + + if err := scanner.Err(); err != nil { + return err + } + if err := forEachRef.Wait(); err != nil { + return err + } + + entry := grpc_logrus.Extract(ctx).WithField("when", when) + for _, field := range []string{"blob", "commit", "tag", "tree"} { + key := "dangling." + field + ".ref" + entry = entry.WithField(key, counts[field]) + } + + entry.Info("pool dangling ref stats") + + return nil +} |