diff options
author | Pavlo Strokov <pstrokov@gitlab.com> | 2020-01-08 13:55:21 +0300 |
---|---|---|
committer | Pavlo Strokov <pstrokov@gitlab.com> | 2020-01-08 13:55:21 +0300 |
commit | 6b1e1f192c2412424c45570edddb95ff6b29172c (patch) | |
tree | cef4e1c938ab46b3d8a0470a411533bf8329b761 | |
parent | 632f765dc7b42ee95af60065951e3a4948c7e65a (diff) | |
parent | 1c5b30c28ca2e558bbe6ba5dee0617ef95210971 (diff) |
Merge branch 'jv-pool-log-size' into 'master'
FetchIntoObjectPool: log pool object and ref directory sizes
See merge request gitlab-org/gitaly!1614
-rw-r--r-- | changelogs/unreleased/jv-pool-log-size.yml | 5 | ||||
-rw-r--r-- | internal/git/objectpool/fetch.go | 69 |
2 files changed, 64 insertions, 10 deletions
diff --git a/changelogs/unreleased/jv-pool-log-size.yml b/changelogs/unreleased/jv-pool-log-size.yml new file mode 100644 index 000000000..df661d5f7 --- /dev/null +++ b/changelogs/unreleased/jv-pool-log-size.yml @@ -0,0 +1,5 @@ +--- +title: 'FetchIntoObjectPool: log pool object and ref directory sizes' +merge_request: 1614 +author: +type: other 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 +} |