From 1c5b30c28ca2e558bbe6ba5dee0617ef95210971 Mon Sep 17 00:00:00 2001 From: Jacob Vosmaer Date: Wed, 8 Jan 2020 10:55:21 +0000 Subject: FetchIntoObjectPool: log pool object and ref directory sizes --- internal/git/objectpool/fetch.go | 69 ++++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 10 deletions(-) (limited to 'internal/git') diff --git a/internal/git/objectpool/fetch.go b/internal/git/objectpool/fetch.go index 2eae85b17..b042706a0 100644 --- a/internal/git/objectpool/fetch.go +++ b/internal/git/objectpool/fetch.go @@ -2,11 +2,17 @@ package objectpool import ( "bufio" + "bytes" "context" "fmt" + "io/ioutil" + "os/exec" + "path/filepath" + "strconv" "strings" - grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" + "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus/ctxlogrus" + "github.com/sirupsen/logrus" "gitlab.com/gitlab-org/gitaly/internal/command" "gitlab.com/gitlab-org/gitaly/internal/git" "gitlab.com/gitlab-org/gitaly/internal/git/repository" @@ -72,7 +78,7 @@ func (o *ObjectPool) FetchFromOrigin(ctx context.Context, origin *gitalypb.Repos return err } - if err := logDanglingRefs(ctx, o, "before fetch"); err != nil { + if err := o.logStats(ctx, "before fetch"); err != nil { return err } @@ -94,7 +100,7 @@ func (o *ObjectPool) FetchFromOrigin(ctx context.Context, origin *gitalypb.Repos return err } - if err := logDanglingRefs(ctx, o, "after fetch"); err != nil { + if err := o.logStats(ctx, "after fetch"); err != nil { return err } @@ -185,8 +191,23 @@ 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{ +func (o *ObjectPool) logStats(ctx context.Context, when string) error { + fields := logrus.Fields{ + "when": when, + } + + for key, dir := range map[string]string{ + "poolObjectsSize": "objects", + "poolRefsSize": "refs", + } { + var err error + fields[key], err = sizeDir(ctx, filepath.Join(o.FullPath(), dir)) + if err != nil { + return err + } + } + + forEachRef, err := git.SafeCmd(ctx, o, nil, git.SubCmd{ Name: "for-each-ref", Flags: []git.Option{git.Flag{"--format=%(objecttype)"}}, Args: []string{danglingObjectNamespace}, @@ -208,13 +229,41 @@ func logDanglingRefs(ctx context.Context, pool repository.GitRepo, when string) 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]) + for _, key := range []string{"blob", "commit", "tag", "tree"} { + fields["dangling."+key+".ref"] = counts[key] } - entry.Info("pool dangling ref stats") + ctxlogrus.Extract(ctx).WithFields(fields).Info("pool dangling ref stats") return nil } + +func sizeDir(ctx context.Context, dir string) (int64, error) { + // du -k reports size in KB + cmd, err := command.New(ctx, exec.Command("du", "-sk", dir), nil, nil, nil) + if err != nil { + return 0, err + } + + sizeLine, err := ioutil.ReadAll(cmd) + if err != nil { + return 0, err + } + + if err := cmd.Wait(); err != nil { + return 0, err + } + + sizeParts := bytes.Split(sizeLine, []byte("\t")) + if len(sizeParts) != 2 { + return 0, fmt.Errorf("malformed du output: %q", sizeLine) + } + + size, err := strconv.ParseInt(string(sizeParts[0]), 10, 0) + if err != nil { + return 0, err + } + + // Convert KB to B + return size * 1024, nil +} -- cgit v1.2.3