diff options
author | Kim Carlbäcker <kim.carlbacker@gmail.com> | 2017-12-07 17:02:05 +0300 |
---|---|---|
committer | Kim Carlbäcker <kim.carlbacker@gmail.com> | 2017-12-07 17:02:05 +0300 |
commit | b694b0085c16cc4610628b2d1d5e30d1dd48a0bd (patch) | |
tree | 58678b85ba45407dc7530adc092efaa887745d35 | |
parent | b89741eb88675f5f23fca7196772d6fdd2aac959 (diff) | |
parent | 1f21dad439f803cd3034ba47646f9c28a9592b17 (diff) |
Implement RepositoryService::Fsck
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | internal/service/repository/fsck.go | 16 | ||||
-rw-r--r-- | internal/service/repository/fsck_test.go | 81 | ||||
-rw-r--r-- | ruby/lib/gitaly_server/repository_service.rb | 12 |
4 files changed, 108 insertions, 3 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 56b685c98..da73ec187 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ UNRELEASED +- Implement RepostoryService::Fsck + https://gitlab.com/gitlab-org/gitaly/merge_requests/475 - Increase default gitaly-ruby connection timeout to 40s https://gitlab.com/gitlab-org/gitaly/merge_requests/476 - Update vendored gitlab_git to f3a3bd50eafdcfcaeea21d6cfa0b8bbae7720fec diff --git a/internal/service/repository/fsck.go b/internal/service/repository/fsck.go index c31a963ec..6286160b2 100644 --- a/internal/service/repository/fsck.go +++ b/internal/service/repository/fsck.go @@ -1,13 +1,23 @@ package repository import ( - "gitlab.com/gitlab-org/gitaly/internal/helper" - pb "gitlab.com/gitlab-org/gitaly-proto/go" "golang.org/x/net/context" + + "gitlab.com/gitlab-org/gitaly/internal/rubyserver" ) func (s *server) Fsck(ctx context.Context, req *pb.FsckRequest) (*pb.FsckResponse, error) { - return nil, helper.Unimplemented + client, err := s.RepositoryServiceClient(ctx) + if err != nil { + return nil, err + } + + clientCtx, err := rubyserver.SetHeaders(ctx, req.GetRepository()) + if err != nil { + return nil, err + } + + return client.Fsck(clientCtx, req) } diff --git a/internal/service/repository/fsck_test.go b/internal/service/repository/fsck_test.go new file mode 100644 index 000000000..85303d369 --- /dev/null +++ b/internal/service/repository/fsck_test.go @@ -0,0 +1,81 @@ +package repository + +import ( + "os" + "path" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + pb "gitlab.com/gitlab-org/gitaly-proto/go" + "gitlab.com/gitlab-org/gitaly/internal/testhelper" +) + +func TestFsckSuccess(t *testing.T) { + ctx, cancel := testhelper.Context() + defer cancel() + + server, serverSocketPath := runRepoServer(t) + defer server.Stop() + + client, conn := newRepositoryClient(t, serverSocketPath) + defer conn.Close() + + testRepo, _, cleanupFn := testhelper.NewTestRepo(t) + defer cleanupFn() + + c, err := client.Fsck(ctx, &pb.FsckRequest{Repository: testRepo}) + assert.NoError(t, err) + assert.NotNil(t, c) + assert.Empty(t, c.GetError()) +} + +func TestFsckFailureSeverlyBrokenRepo(t *testing.T) { + ctx, cancel := testhelper.Context() + defer cancel() + + server, serverSocketPath := runRepoServer(t) + defer server.Stop() + + client, conn := newRepositoryClient(t, serverSocketPath) + defer conn.Close() + + testRepo, testRepoPath, cleanupFn := testhelper.NewTestRepo(t) + defer cleanupFn() + + // This makes the repo severly broken so that `git` does not identify it as a + // proper repo. + require.NoError(t, os.RemoveAll(path.Join(testRepoPath, "objects"))) + fd, err := os.Create(path.Join(testRepoPath, "objects")) + require.NoError(t, err) + require.NoError(t, fd.Close()) + + c, err := client.Fsck(ctx, &pb.FsckRequest{Repository: testRepo}) + assert.NoError(t, err) + assert.NotNil(t, c) + assert.Contains(t, string(c.GetError()), "could not find repository") +} + +func TestFsckFailureSlightlyBrokenRepo(t *testing.T) { + ctx, cancel := testhelper.Context() + defer cancel() + + server, serverSocketPath := runRepoServer(t) + defer server.Stop() + + client, conn := newRepositoryClient(t, serverSocketPath) + defer conn.Close() + + testRepo, testRepoPath, cleanupFn := testhelper.NewTestRepo(t) + defer cleanupFn() + + // This makes the repo slighly broken so that `git` still identify it as a + // proper repo, but `fsck` complains about broken refs... + require.NoError(t, os.RemoveAll(path.Join(testRepoPath, "objects", "pack"))) + + c, err := client.Fsck(ctx, &pb.FsckRequest{Repository: testRepo}) + assert.NoError(t, err) + assert.NotNil(t, c) + assert.NotEmpty(t, string(c.GetError())) + assert.Contains(t, string(c.GetError()), "Could not fsck repository") +} diff --git a/ruby/lib/gitaly_server/repository_service.rb b/ruby/lib/gitaly_server/repository_service.rb index cee25cba7..cd6d14ada 100644 --- a/ruby/lib/gitaly_server/repository_service.rb +++ b/ruby/lib/gitaly_server/repository_service.rb @@ -27,5 +27,17 @@ module GitalyServer Gitaly::FetchSourceBranchResponse.new(result: result) end end + + def fsck(request, call) + repo = Gitlab::Git::Repository.from_gitaly(request.repository, call) + + repo.fsck + + Gitaly::FsckResponse.new + rescue Gitlab::Git::Repository::GitError => ex + Gitaly::FsckResponse.new(error: ex.message.b) + rescue Rugged::RepositoryError => ex + Gitaly::FsckResponse.new(error: ex.message.b) + end end end |