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:
authorPavlo Strokov <pstrokov@gitlab.com>2020-01-08 13:55:21 +0300
committerPavlo Strokov <pstrokov@gitlab.com>2020-01-08 13:55:21 +0300
commit6b1e1f192c2412424c45570edddb95ff6b29172c (patch)
treecef4e1c938ab46b3d8a0470a411533bf8329b761
parent632f765dc7b42ee95af60065951e3a4948c7e65a (diff)
parent1c5b30c28ca2e558bbe6ba5dee0617ef95210971 (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.yml5
-rw-r--r--internal/git/objectpool/fetch.go69
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
+}