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-16 15:40:12 +0300
commit06b14498122b0a5bab966384375e497566d25574 (patch)
tree78eeb60870e567b05e61fd20612b9803c2b3dbcc
parentae5e48879695dd46c3297a62bc81e8e591cd391a (diff)
repository: Exclude alternate object directories in repository 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.go76
2 files changed, 75 insertions, 2 deletions
diff --git a/internal/gitaly/service/repository/size.go b/internal/gitaly/service/repository/size.go
index c73429418..658dc7fb1 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.WithExcludeRefs(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..fbfe78413 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,77 @@ 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)
+
+ if featureflag.RevlistForRepoSize.IsEnabled(ctx) {
+ assert.Equal(t, int64(0), response.GetSize())
+ } else {
+ assert.Less(t, response.GetSize(), sizeBeforePool)
+ }
}
func testSuccessfulRepositorySizeRequest(t *testing.T, ctx context.Context) {