diff options
author | John Cai <jcai@gitlab.com> | 2022-05-13 18:16:21 +0300 |
---|---|---|
committer | John Cai <jcai@gitlab.com> | 2022-05-16 15:40:12 +0300 |
commit | 06b14498122b0a5bab966384375e497566d25574 (patch) | |
tree | 78eeb60870e567b05e61fd20612b9803c2b3dbcc | |
parent | ae5e48879695dd46c3297a62bc81e8e591cd391a (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.go | 1 | ||||
-rw-r--r-- | internal/gitaly/service/repository/size_test.go | 76 |
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) { |