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:
authorPatrick Steinhardt <psteinhardt@gitlab.com>2021-02-22 15:21:25 +0300
committerPatrick Steinhardt <psteinhardt@gitlab.com>2021-02-24 16:43:30 +0300
commitebfe3f2d6e18403bf9b0f3de029d6de9e848de86 (patch)
treee3a66d9e0875d1d4f11632297f9c33033b4e8973
parent8864df1e0f44dd0179600513287496a72eab66f1 (diff)
blob: Port GetLFSPointers to Go
This commit ports the Ruby implementation of the GetLFSPointers RPC to Go. The new implementation is hidden behind a feature flag.
-rw-r--r--internal/gitaly/service/blob/lfs_pointers.go30
-rw-r--r--internal/gitaly/service/blob/lfs_pointers_test.go18
-rw-r--r--internal/metadata/featureflag/feature_flags.go3
3 files changed, 45 insertions, 6 deletions
diff --git a/internal/gitaly/service/blob/lfs_pointers.go b/internal/gitaly/service/blob/lfs_pointers.go
index 0a7dc0093..cbd0e0c6f 100644
--- a/internal/gitaly/service/blob/lfs_pointers.go
+++ b/internal/gitaly/service/blob/lfs_pointers.go
@@ -40,6 +40,9 @@ type getLFSPointerByRevisionRequest interface {
GetRevision() []byte
}
+// GetLFSPointers takes the list of requested blob IDs and filters them down to blobs which are
+// valid LFS pointers. It is fine to pass blob IDs which do not point to a valid LFS pointer, but
+// passing blob IDs which do not exist results in an error.
func (s *server) GetLFSPointers(req *gitalypb.GetLFSPointersRequest, stream gitalypb.BlobService_GetLFSPointersServer) error {
ctx := stream.Context()
@@ -47,6 +50,33 @@ func (s *server) GetLFSPointers(req *gitalypb.GetLFSPointersRequest, stream gita
return status.Errorf(codes.InvalidArgument, "GetLFSPointers: %v", err)
}
+ if featureflag.IsDisabled(ctx, featureflag.GoGetLFSPointers) {
+ return s.rubyGetLFSPointers(req, stream)
+ }
+
+ repo := localrepo.New(s.gitCmdFactory, req.Repository, s.cfg)
+ objectIDs := strings.Join(req.BlobIds, "\n")
+
+ lfsPointers, err := readLFSPointers(ctx, repo, s.gitCmdFactory, strings.NewReader(objectIDs), false)
+ if err != nil {
+ return err
+ }
+
+ err = sliceLFSPointers(lfsPointers, func(slice []*gitalypb.LFSPointer) error {
+ return stream.Send(&gitalypb.GetLFSPointersResponse{
+ LfsPointers: slice,
+ })
+ })
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (s *server) rubyGetLFSPointers(req *gitalypb.GetLFSPointersRequest, stream gitalypb.BlobService_GetLFSPointersServer) error {
+ ctx := stream.Context()
+
client, err := s.ruby.BlobServiceClient(ctx)
if err != nil {
return err
diff --git a/internal/gitaly/service/blob/lfs_pointers_test.go b/internal/gitaly/service/blob/lfs_pointers_test.go
index 63e1ee4ae..612153121 100644
--- a/internal/gitaly/service/blob/lfs_pointers_test.go
+++ b/internal/gitaly/service/blob/lfs_pointers_test.go
@@ -64,6 +64,12 @@ var (
)
func TestSuccessfulGetLFSPointersRequest(t *testing.T) {
+ testhelper.NewFeatureSets([]featureflag.FeatureFlag{
+ featureflag.GoGetLFSPointers,
+ }).Run(t, testSuccessfulGetLFSPointersRequest)
+}
+
+func testSuccessfulGetLFSPointersRequest(t *testing.T, ctx context.Context) {
stop, serverSocketPath := runBlobServer(t, testhelper.DefaultLocator())
defer stop()
@@ -73,9 +79,6 @@ func TestSuccessfulGetLFSPointersRequest(t *testing.T) {
client, conn := newBlobClient(t, serverSocketPath)
defer conn.Close()
- ctx, cancel := testhelper.Context()
- defer cancel()
-
lfsPointerIds := []string{
lfsPointer1,
lfsPointer2,
@@ -116,6 +119,12 @@ func TestSuccessfulGetLFSPointersRequest(t *testing.T) {
}
func TestFailedGetLFSPointersRequestDueToValidations(t *testing.T) {
+ testhelper.NewFeatureSets([]featureflag.FeatureFlag{
+ featureflag.GoGetLFSPointers,
+ }).Run(t, testFailedGetLFSPointersRequestDueToValidations)
+}
+
+func testFailedGetLFSPointersRequestDueToValidations(t *testing.T, ctx context.Context) {
stop, serverSocketPath := runBlobServer(t, testhelper.DefaultLocator())
defer stop()
@@ -150,9 +159,6 @@ func TestFailedGetLFSPointersRequestDueToValidations(t *testing.T) {
for _, testCase := range testCases {
t.Run(testCase.desc, func(t *testing.T) {
- ctx, cancel := testhelper.Context()
- defer cancel()
-
stream, err := client.GetLFSPointers(ctx, testCase.request)
require.NoError(t, err)
diff --git a/internal/metadata/featureflag/feature_flags.go b/internal/metadata/featureflag/feature_flags.go
index 5515afe2d..71fcf6581 100644
--- a/internal/metadata/featureflag/feature_flags.go
+++ b/internal/metadata/featureflag/feature_flags.go
@@ -30,6 +30,8 @@ var (
GoUserRevert = FeatureFlag{Name: "go_user_revert", OnByDefault: false}
// GoGetAllLFSPointers enables the Go implementation of GetAllLFSPointers
GoGetAllLFSPointers = FeatureFlag{Name: "go_get_all_lfs_pointers", OnByDefault: false}
+ // GoGetLFSPointers enables the Go implementation of GetLFSPointers
+ GoGetLFSPointers = FeatureFlag{Name: "go_get_lfs_pointers", OnByDefault: false}
// TxApplyBfgObjectMapStream enables transactions for ApplyBfgObjectMapStream
TxApplyBfgObjectMapStream = FeatureFlag{Name: "tx_apply_bfg_object_map_stream", OnByDefault: true}
@@ -111,6 +113,7 @@ var All = []FeatureFlag{
GoUserUpdateSubmodule,
GoUserRevert,
GoGetAllLFSPointers,
+ GoGetLFSPointers,
TxApplyBfgObjectMapStream,
TxApplyGitattributes,
TxResolveConflicts,