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>2020-08-20 09:10:28 +0300
committerPatrick Steinhardt <psteinhardt@gitlab.com>2020-08-20 11:04:41 +0300
commitd9179f7298abfbdb171372a1d8bc587f5e43b98c (patch)
tree48e58eecfca48b22bafa8148cfdedefe605fc5f4
parent56251315578cd17c0ceebcb911e8d3ddb159afca (diff)
proto: Relabel `smarthttp.InfoRefsReceivePack` as accessor
The `smarthttp.InfoRefsReceivePack` RPC is currently labelled as mutator. Taking a closer look at it, there is no way it can change any objects in the repo though, as it will always either spawn `git receive-pack --stateless-rpc --advertise-refs` or `git upload-pack --stateless-rpc --advertise-refs`. While git-receive-pack(1) may modify the repo, it won't ever do so with the `--advertise-refs` flag, as it will cause the command to only advertise references and then exit immediately afterwards. As the RPC is called in quick succession with `smarthttp.PostUploadPack` in case a user performs a push, the first call to InfoRefsReceivePack would've increased the repository generation and caused replication jobs to be created. As a result, when PostUploadPack gets invoked it is likely that secondaries will be treated as out-of-date as replication jobs usually weren't processed yet. This in turn breaks transactions, as we will now only add the primary to any transaction for all pushes via smarthttp. So let's relabel the RPC as an accessor to avoid replication when it's called and fix the described issue.
-rw-r--r--changelogs/unreleased/pks-inforefs-accessor.yml5
-rw-r--r--internal/praefect/protoregistry/protoregistry_test.go2
-rw-r--r--proto/go/gitalypb/smarthttp.pb.go70
-rw-r--r--proto/smarthttp.proto6
-rw-r--r--ruby/proto/gitaly/smarthttp_services_pb.rb4
5 files changed, 46 insertions, 41 deletions
diff --git a/changelogs/unreleased/pks-inforefs-accessor.yml b/changelogs/unreleased/pks-inforefs-accessor.yml
new file mode 100644
index 000000000..79f16621f
--- /dev/null
+++ b/changelogs/unreleased/pks-inforefs-accessor.yml
@@ -0,0 +1,5 @@
+---
+title: Relabel smarthttp.InfoRefsReceivePack as accessor
+merge_request: 2487
+author:
+type: fixed
diff --git a/internal/praefect/protoregistry/protoregistry_test.go b/internal/praefect/protoregistry/protoregistry_test.go
index fdd3575ff..030c971c1 100644
--- a/internal/praefect/protoregistry/protoregistry_test.go
+++ b/internal/praefect/protoregistry/protoregistry_test.go
@@ -156,7 +156,7 @@ func TestNewProtoRegistry(t *testing.T) {
},
"SmartHTTPService": map[string]protoregistry.OpType{
"InfoRefsUploadPack": protoregistry.OpAccessor,
- "InfoRefsReceivePack": protoregistry.OpMutator,
+ "InfoRefsReceivePack": protoregistry.OpAccessor,
"PostUploadPack": protoregistry.OpAccessor,
"PostReceivePack": protoregistry.OpMutator,
},
diff --git a/proto/go/gitalypb/smarthttp.pb.go b/proto/go/gitalypb/smarthttp.pb.go
index 67bd9faec..df9a6a04d 100644
--- a/proto/go/gitalypb/smarthttp.pb.go
+++ b/proto/go/gitalypb/smarthttp.pb.go
@@ -372,37 +372,37 @@ func init() {
func init() { proto.RegisterFile("smarthttp.proto", fileDescriptor_7da929f3b109874f) }
var fileDescriptor_7da929f3b109874f = []byte{
- // 477 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x53, 0x41, 0x6f, 0xd3, 0x30,
- 0x14, 0x96, 0xd3, 0xae, 0xb0, 0xd7, 0x42, 0x2b, 0x4f, 0xb0, 0x28, 0x12, 0xac, 0x04, 0x09, 0xe5,
- 0xd0, 0xb5, 0xd5, 0xb8, 0x70, 0x1e, 0x17, 0x76, 0xa2, 0x78, 0xdb, 0x05, 0x24, 0x22, 0x37, 0x71,
- 0x3d, 0x0b, 0x37, 0x0e, 0xb1, 0x37, 0x69, 0x7f, 0x83, 0x0b, 0x1c, 0xf8, 0x1d, 0xfc, 0x04, 0x7e,
- 0x12, 0x07, 0x4e, 0x28, 0x71, 0xbb, 0x2c, 0x4d, 0x83, 0x10, 0x88, 0x5b, 0xf2, 0xbe, 0xe7, 0xef,
- 0x7d, 0xdf, 0xe7, 0x67, 0xe8, 0xeb, 0x25, 0xcd, 0xcc, 0x85, 0x31, 0xe9, 0x38, 0xcd, 0x94, 0x51,
- 0xb8, 0xc3, 0x85, 0xa1, 0xf2, 0xda, 0x03, 0x29, 0x12, 0x63, 0x6b, 0x5e, 0x4f, 0x5f, 0xd0, 0x8c,
- 0xc5, 0xf6, 0xcf, 0xff, 0x8a, 0xa0, 0x7f, 0x92, 0x2c, 0x14, 0x61, 0x0b, 0x4d, 0xd8, 0xc7, 0x4b,
- 0xa6, 0x0d, 0x7e, 0x01, 0x90, 0xb1, 0x54, 0x69, 0x61, 0x54, 0x76, 0xed, 0xa2, 0x21, 0x0a, 0xba,
- 0x47, 0x78, 0x6c, 0xa9, 0xc6, 0xe4, 0x06, 0x39, 0x6e, 0x7f, 0xf9, 0x3e, 0x42, 0xe4, 0x56, 0x2f,
- 0x1e, 0x01, 0xe6, 0xc2, 0x84, 0x91, 0x4a, 0x16, 0x82, 0x87, 0x2a, 0x35, 0x42, 0x25, 0xda, 0x75,
- 0x86, 0xad, 0x60, 0x97, 0x0c, 0xb8, 0x30, 0x2f, 0x0b, 0xe0, 0xb5, 0xad, 0xe3, 0x27, 0xd0, 0xcb,
- 0xbb, 0x0b, 0x21, 0x91, 0x92, 0x6e, 0x6b, 0x88, 0x82, 0x5d, 0xd2, 0xe5, 0xc2, 0xcc, 0x56, 0x25,
- 0xff, 0x19, 0x0c, 0x4a, 0x75, 0x3a, 0x55, 0x89, 0x66, 0x18, 0x43, 0x3b, 0xa6, 0x86, 0x16, 0xc2,
- 0x7a, 0xa4, 0xf8, 0xf6, 0xbf, 0x21, 0x78, 0x30, 0x53, 0xda, 0x9c, 0xa7, 0x52, 0xd1, 0x78, 0x46,
- 0xa3, 0x0f, 0xff, 0x6e, 0x66, 0x3d, 0xc7, 0x29, 0xe7, 0x34, 0x18, 0x6c, 0xfd, 0xa1, 0xc1, 0x76,
- 0xdd, 0xe0, 0x08, 0x1e, 0x6e, 0xea, 0xfe, 0x8d, 0xcd, 0x4f, 0x8e, 0x6d, 0x27, 0x2c, 0x62, 0xe2,
- 0x8a, 0xfd, 0x3f, 0x9f, 0x7b, 0xb0, 0xc3, 0x65, 0x28, 0xe2, 0xd5, 0x9d, 0xb4, 0xb9, 0x3c, 0x89,
- 0xf1, 0x53, 0xb8, 0xc7, 0x65, 0x78, 0x6b, 0x8a, 0xf5, 0xd3, 0xe3, 0xb2, 0xe4, 0xc7, 0x07, 0xd0,
- 0xe5, 0x32, 0xbc, 0xd4, 0x2c, 0x4b, 0xe8, 0x92, 0xb9, 0x3b, 0x45, 0x0b, 0x70, 0x79, 0xbe, 0xaa,
- 0xd4, 0x42, 0xe9, 0xd4, 0x42, 0x69, 0x48, 0xf9, 0xce, 0xf6, 0x94, 0xfd, 0x43, 0xd8, 0xaf, 0x65,
- 0xd2, 0x9c, 0xe1, 0xd1, 0x0f, 0x07, 0x06, 0xa7, 0xf9, 0x3b, 0x79, 0x75, 0x76, 0x36, 0x3b, 0x65,
- 0xd9, 0x95, 0x88, 0x18, 0x7e, 0x03, 0x78, 0xbd, 0x67, 0xe5, 0x55, 0xe0, 0xfd, 0x75, 0x7e, 0x1b,
- 0x2f, 0xc4, 0x73, 0xeb, 0x80, 0x9d, 0xe8, 0x77, 0x7e, 0x7e, 0x0e, 0x9c, 0xbb, 0xce, 0x14, 0x61,
- 0x02, 0x7b, 0x25, 0x7a, 0x23, 0xed, 0xef, 0x39, 0xd1, 0x14, 0xe1, 0x77, 0x70, 0xbf, 0xba, 0x2d,
- 0xf8, 0xd1, 0xfa, 0xd4, 0xd6, 0xed, 0xf7, 0x1e, 0x37, 0xc1, 0x55, 0xb9, 0x41, 0x4e, 0xfe, 0x1e,
- 0xfa, 0x1b, 0x39, 0xe2, 0xca, 0xf1, 0xfa, 0xd2, 0x79, 0x07, 0x8d, 0x78, 0x55, 0x7a, 0xce, 0x7f,
- 0x3c, 0x7d, 0x9b, 0x77, 0x4b, 0x3a, 0x1f, 0x47, 0x6a, 0x39, 0xb1, 0x9f, 0x87, 0x2a, 0xe3, 0x13,
- 0xcb, 0x31, 0x29, 0x36, 0x62, 0xc2, 0xd5, 0xea, 0x3f, 0x9d, 0xcf, 0x3b, 0x45, 0xe9, 0xf9, 0xaf,
- 0x00, 0x00, 0x00, 0xff, 0xff, 0x66, 0x0e, 0xc2, 0x08, 0xd8, 0x04, 0x00, 0x00,
+ // 475 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x53, 0xc1, 0x6e, 0xd3, 0x40,
+ 0x10, 0xd5, 0x3a, 0x69, 0xa0, 0x93, 0x40, 0xa2, 0xa9, 0xa0, 0x96, 0x25, 0x68, 0x30, 0x12, 0xf2,
+ 0x21, 0x4d, 0xa2, 0x72, 0xe1, 0x5c, 0x2e, 0xf4, 0x44, 0x70, 0xdb, 0x0b, 0x48, 0x58, 0x1b, 0x7b,
+ 0xb3, 0x5d, 0xb1, 0xf1, 0x1a, 0xef, 0xb6, 0x52, 0x7f, 0x83, 0x0b, 0x1c, 0xf8, 0x0e, 0x3e, 0x81,
+ 0x4f, 0xe2, 0xc0, 0x09, 0xc5, 0x9b, 0xd4, 0x4d, 0x5c, 0x23, 0xa4, 0x88, 0xdb, 0xee, 0xbc, 0xd9,
+ 0x37, 0xf3, 0xde, 0xce, 0x40, 0x57, 0xcf, 0x69, 0x6e, 0x2e, 0x8c, 0xc9, 0x86, 0x59, 0xae, 0x8c,
+ 0xc2, 0x16, 0x17, 0x86, 0xca, 0x6b, 0x0f, 0xa4, 0x48, 0x8d, 0x8d, 0x79, 0x1d, 0x7d, 0x41, 0x73,
+ 0x96, 0xd8, 0x9b, 0xff, 0x9d, 0x40, 0xf7, 0x24, 0x9d, 0xa9, 0x90, 0xcd, 0x74, 0xc8, 0x3e, 0x5f,
+ 0x32, 0x6d, 0xf0, 0x15, 0x40, 0xce, 0x32, 0xa5, 0x85, 0x51, 0xf9, 0xb5, 0x4b, 0xfa, 0x24, 0x68,
+ 0x1f, 0xe1, 0xd0, 0x52, 0x0d, 0xc3, 0x1b, 0xe4, 0xb8, 0xf9, 0xed, 0xe7, 0x80, 0x84, 0xb7, 0x72,
+ 0x71, 0x00, 0xc8, 0x85, 0x89, 0x62, 0x95, 0xce, 0x04, 0x8f, 0x54, 0x66, 0x84, 0x4a, 0xb5, 0xeb,
+ 0xf4, 0x1b, 0xc1, 0x6e, 0xd8, 0xe3, 0xc2, 0xbc, 0x2e, 0x80, 0xb7, 0x36, 0x8e, 0xcf, 0xa0, 0xb3,
+ 0xc8, 0x2e, 0x1a, 0x89, 0x95, 0x74, 0x1b, 0x7d, 0x12, 0xec, 0x86, 0x6d, 0x2e, 0xcc, 0x64, 0x19,
+ 0xf2, 0x5f, 0x40, 0xaf, 0xec, 0x4e, 0x67, 0x2a, 0xd5, 0x0c, 0x11, 0x9a, 0x09, 0x35, 0xb4, 0x68,
+ 0xac, 0x13, 0x16, 0x67, 0xff, 0x07, 0x81, 0x47, 0x13, 0xa5, 0xcd, 0x79, 0x26, 0x15, 0x4d, 0x26,
+ 0x34, 0xfe, 0xb4, 0xbd, 0x98, 0x55, 0x1d, 0xa7, 0xac, 0x53, 0x23, 0xb0, 0xf1, 0x8f, 0x02, 0x9b,
+ 0x55, 0x81, 0x03, 0x78, 0xbc, 0xd9, 0xf7, 0x5f, 0x64, 0x7e, 0x71, 0x6c, 0x7a, 0xc8, 0x62, 0x26,
+ 0xae, 0xd8, 0xff, 0xd3, 0xb9, 0x07, 0x3b, 0x5c, 0x46, 0x22, 0x59, 0xfe, 0x49, 0x93, 0xcb, 0x93,
+ 0x04, 0x9f, 0xc3, 0x03, 0x2e, 0xa3, 0x5b, 0x55, 0xac, 0x9e, 0x0e, 0x97, 0x25, 0x3f, 0x1e, 0x40,
+ 0x9b, 0xcb, 0xe8, 0x52, 0xb3, 0x3c, 0xa5, 0x73, 0xe6, 0xee, 0x14, 0x29, 0xc0, 0xe5, 0xf9, 0x32,
+ 0x52, 0x31, 0xa5, 0x55, 0x31, 0xa5, 0xc6, 0xe5, 0x7b, 0x77, 0xbb, 0xec, 0x1f, 0xc2, 0x7e, 0xc5,
+ 0x93, 0x7a, 0x0f, 0x8f, 0x7e, 0x39, 0xd0, 0x3b, 0x5d, 0xec, 0xc9, 0x9b, 0xb3, 0xb3, 0xc9, 0x29,
+ 0xcb, 0xaf, 0x44, 0xcc, 0xf0, 0x1d, 0xe0, 0x6a, 0xce, 0xca, 0xaf, 0xc0, 0xfd, 0x95, 0x7f, 0x1b,
+ 0x1b, 0xe2, 0xb9, 0x55, 0xc0, 0x56, 0xf4, 0x5b, 0xbf, 0xbf, 0x06, 0xce, 0x7d, 0x67, 0x4c, 0x30,
+ 0x84, 0xbd, 0x12, 0xbd, 0x69, 0x6d, 0x3b, 0xce, 0x0f, 0xf0, 0x70, 0x7d, 0x5a, 0xf0, 0xc9, 0xea,
+ 0xd5, 0x9d, 0xd3, 0xef, 0x3d, 0xad, 0x83, 0xd7, 0xa9, 0x03, 0x32, 0x26, 0xf8, 0x11, 0xba, 0x1b,
+ 0x3e, 0xe2, 0xda, 0xf3, 0xea, 0xd0, 0x79, 0x07, 0xb5, 0xf8, 0x1a, 0x3f, 0x59, 0xf0, 0x1f, 0x8f,
+ 0xdf, 0x2f, 0xb2, 0x25, 0x9d, 0x0e, 0x63, 0x35, 0x1f, 0xd9, 0xe3, 0xa1, 0xca, 0xf9, 0xc8, 0x72,
+ 0x8c, 0x8a, 0x89, 0x18, 0x71, 0xb5, 0xbc, 0x67, 0xd3, 0x69, 0xab, 0x08, 0xbd, 0xfc, 0x13, 0x00,
+ 0x00, 0xff, 0xff, 0xc2, 0x79, 0x15, 0x9d, 0xd8, 0x04, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -422,8 +422,8 @@ type SmartHTTPServiceClient interface {
// will upload the packs to that user. The user doesn't upload new objects.
InfoRefsUploadPack(ctx context.Context, in *InfoRefsRequest, opts ...grpc.CallOption) (SmartHTTPService_InfoRefsUploadPackClient, error)
// The response body for GET /info/refs?service=git-receive-pack
- // Will be invoked when the user executes a `git push`, meaning the server
- // will receive new objects in the pack from the user.
+ // Will be invoked when the user executes a `git push`, but only advertises
+ // references to the user.
InfoRefsReceivePack(ctx context.Context, in *InfoRefsRequest, opts ...grpc.CallOption) (SmartHTTPService_InfoRefsReceivePackClient, error)
// Request and response body for POST /upload-pack
PostUploadPack(ctx context.Context, opts ...grpc.CallOption) (SmartHTTPService_PostUploadPackClient, error)
@@ -572,8 +572,8 @@ type SmartHTTPServiceServer interface {
// will upload the packs to that user. The user doesn't upload new objects.
InfoRefsUploadPack(*InfoRefsRequest, SmartHTTPService_InfoRefsUploadPackServer) error
// The response body for GET /info/refs?service=git-receive-pack
- // Will be invoked when the user executes a `git push`, meaning the server
- // will receive new objects in the pack from the user.
+ // Will be invoked when the user executes a `git push`, but only advertises
+ // references to the user.
InfoRefsReceivePack(*InfoRefsRequest, SmartHTTPService_InfoRefsReceivePackServer) error
// Request and response body for POST /upload-pack
PostUploadPack(SmartHTTPService_PostUploadPackServer) error
diff --git a/proto/smarthttp.proto b/proto/smarthttp.proto
index 5a3e48eed..a9fe96c6d 100644
--- a/proto/smarthttp.proto
+++ b/proto/smarthttp.proto
@@ -18,11 +18,11 @@ service SmartHTTPService {
}
// The response body for GET /info/refs?service=git-receive-pack
- // Will be invoked when the user executes a `git push`, meaning the server
- // will receive new objects in the pack from the user.
+ // Will be invoked when the user executes a `git push`, but only advertises
+ // references to the user.
rpc InfoRefsReceivePack(InfoRefsRequest) returns (stream InfoRefsResponse) {
option (op_type) = {
- op: MUTATOR
+ op: ACCESSOR
};
}
diff --git a/ruby/proto/gitaly/smarthttp_services_pb.rb b/ruby/proto/gitaly/smarthttp_services_pb.rb
index 39c3aebc9..11a6e87b1 100644
--- a/ruby/proto/gitaly/smarthttp_services_pb.rb
+++ b/ruby/proto/gitaly/smarthttp_services_pb.rb
@@ -19,8 +19,8 @@ module Gitaly
# will upload the packs to that user. The user doesn't upload new objects.
rpc :InfoRefsUploadPack, Gitaly::InfoRefsRequest, stream(Gitaly::InfoRefsResponse)
# The response body for GET /info/refs?service=git-receive-pack
- # Will be invoked when the user executes a `git push`, meaning the server
- # will receive new objects in the pack from the user.
+ # Will be invoked when the user executes a `git push`, but only advertises
+ # references to the user.
rpc :InfoRefsReceivePack, Gitaly::InfoRefsRequest, stream(Gitaly::InfoRefsResponse)
# Request and response body for POST /upload-pack
rpc :PostUploadPack, stream(Gitaly::PostUploadPackRequest), stream(Gitaly::PostUploadPackResponse)