diff options
author | Patrick Steinhardt <psteinhardt@gitlab.com> | 2021-02-22 15:21:25 +0300 |
---|---|---|
committer | Patrick Steinhardt <psteinhardt@gitlab.com> | 2021-02-24 16:43:30 +0300 |
commit | ebfe3f2d6e18403bf9b0f3de029d6de9e848de86 (patch) | |
tree | e3a66d9e0875d1d4f11632297f9c33033b4e8973 | |
parent | 8864df1e0f44dd0179600513287496a72eab66f1 (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.go | 30 | ||||
-rw-r--r-- | internal/gitaly/service/blob/lfs_pointers_test.go | 18 | ||||
-rw-r--r-- | internal/metadata/featureflag/feature_flags.go | 3 |
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, |