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:
authorKim Carlbäcker <kim.carlbacker@gmail.com>2017-12-07 17:02:05 +0300
committerKim Carlbäcker <kim.carlbacker@gmail.com>2017-12-07 17:02:05 +0300
commitb694b0085c16cc4610628b2d1d5e30d1dd48a0bd (patch)
tree58678b85ba45407dc7530adc092efaa887745d35
parentb89741eb88675f5f23fca7196772d6fdd2aac959 (diff)
parent1f21dad439f803cd3034ba47646f9c28a9592b17 (diff)
Implement RepositoryService::Fsck
-rw-r--r--CHANGELOG.md2
-rw-r--r--internal/service/repository/fsck.go16
-rw-r--r--internal/service/repository/fsck_test.go81
-rw-r--r--ruby/lib/gitaly_server/repository_service.rb12
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