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:
authorJohn Cai <jcai@gitlab.com>2022-05-13 18:16:21 +0300
committerJohn Cai <jcai@gitlab.com>2022-05-13 20:55:01 +0300
commit3cc80e03c177a55ea11f4d5ac7b6f46db41fb087 (patch)
tree339029fbfd3cb3a6c52cd08e5d076907d1085100
parent22ab4e478aa015e3763114fa6e6eb2a90bb9cace (diff)
repository: Exclude alternate object directories in repository sizejc-exclude-alternates-from-repo-size
When calculating repository size with rev-list, it will count the objects that reside in a pool repository. We don't want to count pool repository storage as part of the repository storage, so include an option to exclude counting any objects that live in an alternate object directory. Changelog: changed
-rw-r--r--internal/gitaly/service/repository/size.go1
-rw-r--r--internal/gitaly/service/repository/size_test.go72
2 files changed, 71 insertions, 2 deletions
diff --git a/internal/gitaly/service/repository/size.go b/internal/gitaly/service/repository/size.go
index a6bb0d33e..92eab9786 100644
--- a/internal/gitaly/service/repository/size.go
+++ b/internal/gitaly/service/repository/size.go
@@ -30,6 +30,7 @@ func (s *server) RepositorySize(ctx context.Context, in *gitalypb.RepositorySize
size, err = repo.Size(
ctx,
localrepo.WithExcludes(excludes...),
+ localrepo.WithoutAlternates(),
)
if err != nil {
return nil, err
diff --git a/internal/gitaly/service/repository/size_test.go b/internal/gitaly/service/repository/size_test.go
index 52252f349..f1286ec69 100644
--- a/internal/gitaly/service/repository/size_test.go
+++ b/internal/gitaly/service/repository/size_test.go
@@ -8,11 +8,14 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitaly/v14/internal/git"
+ "gitlab.com/gitlab-org/gitaly/v14/internal/git/catfile"
"gitlab.com/gitlab-org/gitaly/v14/internal/git/gittest"
+ "gitlab.com/gitlab-org/gitaly/v14/internal/git/objectpool"
"gitlab.com/gitlab-org/gitaly/v14/internal/git/quarantine"
"gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/config"
"gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag"
"gitlab.com/gitlab-org/gitaly/v14/internal/testhelper"
+ "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testcfg"
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
"google.golang.org/grpc/codes"
"google.golang.org/protobuf/proto"
@@ -24,8 +27,73 @@ const testRepoMinSizeKB = 10000
func TestRepositorySize_SuccessfulRequest(t *testing.T) {
t.Parallel()
- testhelper.NewFeatureSets(featureflag.RevlistForRepoSize).
- Run(t, testSuccessfulRepositorySizeRequest)
+
+ featureSet := testhelper.NewFeatureSets(featureflag.RevlistForRepoSize)
+
+ featureSet.Run(t, testSuccessfulRepositorySizeRequest)
+ featureSet.Run(t, testSuccessfulRepositorySizeRequestPoolMember)
+}
+
+func testSuccessfulRepositorySizeRequestPoolMember(t *testing.T, ctx context.Context) {
+ cfg := testcfg.Build(t)
+
+ serverSocketPath := runRepositoryServerWithConfig(t, cfg, nil)
+ cfg.SocketPath = serverSocketPath
+
+ repoClient := newRepositoryClient(t, cfg, serverSocketPath)
+ objectPoolClient := newObjectPoolClient(t, cfg, serverSocketPath)
+
+ repo, repoPath := gittest.CreateRepository(ctx, t, cfg, gittest.CreateRepositoryConfig{
+ Seed: gittest.SeedGitLabTest,
+ })
+
+ sizeRequest := &gitalypb.RepositorySizeRequest{Repository: repo}
+ response, err := repoClient.RepositorySize(ctx, sizeRequest)
+ require.NoError(t, err)
+
+ sizeBeforePool := response.GetSize()
+
+ storage := cfg.Storages[0]
+ relativePath := gittest.NewObjectPoolName(t)
+ catfileCache := catfile.NewCache(cfg)
+ t.Cleanup(catfileCache.Stop)
+
+ // create an object pool
+ gittest.InitRepoDir(t, storage.Path, relativePath)
+ pool, err := objectpool.NewObjectPool(
+ config.NewLocator(cfg),
+ gittest.NewCommandFactory(t, cfg),
+ catfileCache,
+ nil,
+ nil,
+ storage.Name,
+ relativePath,
+ )
+ require.NoError(t, err)
+
+ _, err = objectPoolClient.CreateObjectPool(
+ ctx,
+ &gitalypb.CreateObjectPoolRequest{
+ ObjectPool: pool.ToProto(),
+ Origin: repo,
+ })
+ require.NoError(t, err)
+
+ _, err = objectPoolClient.LinkRepositoryToObjectPool(
+ ctx,
+ &gitalypb.LinkRepositoryToObjectPoolRequest{
+ Repository: repo,
+ ObjectPool: pool.ToProto(),
+ },
+ )
+ require.NoError(t, err)
+
+ gittest.Exec(t, cfg, "-C", repoPath, "gc")
+
+ response, err = repoClient.RepositorySize(ctx, sizeRequest)
+ require.NoError(t, err)
+
+ assert.Less(t, response.GetSize(), sizeBeforePool)
}
func testSuccessfulRepositorySizeRequest(t *testing.T, ctx context.Context) {