diff options
author | John Cai <jcai@gitlab.com> | 2022-05-13 18:16:21 +0300 |
---|---|---|
committer | John Cai <jcai@gitlab.com> | 2022-05-13 20:55:01 +0300 |
commit | 3cc80e03c177a55ea11f4d5ac7b6f46db41fb087 (patch) | |
tree | 339029fbfd3cb3a6c52cd08e5d076907d1085100 | |
parent | 22ab4e478aa015e3763114fa6e6eb2a90bb9cace (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.go | 1 | ||||
-rw-r--r-- | internal/gitaly/service/repository/size_test.go | 72 |
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) { |