pulsar-client-go icon indicating copy to clipboard operation
pulsar-client-go copied to clipboard

gogo/protobuf is deprecated

Open YanshuoH opened this issue 1 year ago • 0 comments

Is your feature request related to a problem? Please describe.

Nowadays, the famous https://github.com/gogo/protobuf is deprecated and it is not compatible with all brand new golang protobuf features.

For instance, when using protobuf as schema, it prompts some errors like such:

      Test Panicked
      protobuf tag not enough fields in Record.state:
      /Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/gogo/[email protected]/proto/table_unmarshal.go:341
click to see the full logs
Schema
/Users/hys/dev/go-workspace/src/go.planetmeican.com/nerds/mq/pulsar/schema_test.go:72
  ProduceAndConsume
  /Users/hys/dev/go-workspace/src/go.planetmeican.com/nerds/mq/pulsar/schema_test.go:92
    with avro and json and protobuf schema
    /Users/hys/dev/go-workspace/src/go.planetmeican.com/nerds/mq/pulsar/schema_test.go:100
      should be able to consume the produced message [It]
      /Users/hys/dev/go-workspace/src/go.planetmeican.com/nerds/mq/pulsar/schema_test.go:101

      Test Panicked
      protobuf tag not enough fields in Record.state:
      /Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/gogo/[email protected]/proto/table_unmarshal.go:341

      Full Stack Trace
      github.com/gogo/protobuf/proto.(*unmarshalInfo).computeUnmarshalInfo(0xc0000ac000)
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/gogo/[email protected]/proto/table_unmarshal.go:341 +0x138a
      github.com/gogo/protobuf/proto.(*unmarshalInfo).unmarshal(0xc0000ac000, {0x489e980}, {0xc00034c0de, 0x29, 0x29})
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/gogo/[email protected]/proto/table_unmarshal.go:138 +0x67
      github.com/gogo/protobuf/proto.(*InternalMessageInfo).Unmarshal(0xc000436680, {0x2d7d7a40, 0xc0002ed740}, {0xc00034c0de, 0x29, 0x29})
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/gogo/[email protected]/proto/table_unmarshal.go:63 +0xd0
      github.com/gogo/protobuf/proto.(*Buffer).Unmarshal(0xc00081ec78, {0x2d7d7a40, 0xc0002ed740})
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/gogo/[email protected]/proto/decode.go:424 +0x153
      github.com/gogo/protobuf/proto.Unmarshal({0xc00034c0de, 0x29, 0x29}, {0x2d7d7a40, 0xc0002ed740})
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/gogo/[email protected]/proto/decode.go:342 +0xef
      github.com/apache/pulsar-client-go/pulsar.(*ProtoSchema).Decode(0x6900f18, {0xc00034c0de, 0x29, 0x29}, {0x48896a0, 0xc0002ed740})
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/apache/[email protected]/pulsar/schema.go:149 +0x58
      github.com/apache/pulsar-client-go/pulsar.(*message).GetSchemaValue(0x58, {0x48896a0, 0xc0002ed740})
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/apache/[email protected]/pulsar/impl_message.go:291 +0x4d
      go.planetmeican.com/nerds/mq/pulsar_test.glob..func8.3.1.1()
      	/Users/hys/dev/go-workspace/src/go.planetmeican.com/nerds/mq/pulsar/schema_test.go:200 +0x134c
      github.com/onsi/ginkgo/internal/leafnodes.(*runner).runSync(0xc00081f440)
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/onsi/[email protected]/internal/leafnodes/runner.go:113 +0xba
      github.com/onsi/ginkgo/internal/leafnodes.(*runner).run(0x0)
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/onsi/[email protected]/internal/leafnodes/runner.go:64 +0x125
      github.com/onsi/ginkgo/internal/leafnodes.(*ItNode).Run(0xc00081f760)
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/onsi/[email protected]/internal/leafnodes/it_node.go:26 +0x7b
      github.com/onsi/ginkgo/internal/spec.(*Spec).runSample(0xc00027fb30, 0xc00081faa8, {0x49f03c0, 0xc000450180})
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/onsi/[email protected]/internal/spec/spec.go:215 +0x2a9
      github.com/onsi/ginkgo/internal/spec.(*Spec).Run(0xc00027fb30, {0x49f03c0, 0xc000450180})
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/onsi/[email protected]/internal/spec/spec.go:138 +0xe7
      github.com/onsi/ginkgo/internal/specrunner.(*SpecRunner).runSpec(0xc0001fe280, 0xc00027fb30)
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/onsi/[email protected]/internal/specrunner/spec_runner.go:200 +0xe5
      github.com/onsi/ginkgo/internal/specrunner.(*SpecRunner).runSpecs(0xc0001fe280)
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/onsi/[email protected]/internal/specrunner/spec_runner.go:170 +0x1a5
      github.com/onsi/ginkgo/internal/specrunner.(*SpecRunner).Run(0xc0001fe280)
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/onsi/[email protected]/internal/specrunner/spec_runner.go:66 +0xc5
      github.com/onsi/ginkgo/internal/suite.(*Suite).Run(0xc00043a2a0, {0x2d8ad520, 0xc000102b60}, {0x48e4ebe, 0x4d27b20}, {0xc000118030, 0x1, 0x1}, {0x4a06f58, 0xc000450180}, ...)
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/onsi/[email protected]/internal/suite/suite.go:79 +0x4d2
      github.com/onsi/ginkgo.RunSpecsWithCustomReporters({0x49f1180, 0xc000102b60}, {0x48e4ebe, 0xc}, {0xc00013b718, 0x1, 0xc00013b728})
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/onsi/[email protected]/ginkgo_dsl.go:229 +0x185
      github.com/onsi/ginkgo.RunSpecs({0x49f1180, 0xc000102b60}, {0x48e4ebe, 0xc})
      	/Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/onsi/[email protected]/ginkgo_dsl.go:210 +0x10b
      go.planetmeican.com/nerds/mq/pulsar_test.TestPulsar(0x0)
      	/Users/hys/dev/go-workspace/src/go.planetmeican.com/nerds/mq/pulsar/pulsar_suite_test.go:23 +0x85
      testing.tRunner(0xc000102b60, 0x4921b20)
      	/Users/hys/.gvm/gos/go1.17/src/testing/testing.go:1259 +0x102
      created by testing.(*T).Run
      	/Users/hys/.gvm/gos/go1.17/src/testing/testing.go:1306 +0x35a

Furthermore, using the google.golang.org/protobuf/reflect/protoreflect and the google.golang.org/protobuf/types/dynamicpb to create dynamic protobuf message also causes trouble.

For example, gogo/protobuf has the checking tags issue: https://github.com/gogo/protobuf/issues/678

      protobuf tag not enough fields in Message.typ:
      /Users/hys/.gvm/pkgsets/go1.17/global/pkg/mod/github.com/gogo/[email protected]/proto/table_unmarshal.go:341
Example code to create dynamic object
		getProtoMsgDescriptor := func() protoreflect.MessageDescriptor {
			fddef := &descriptorpb.FileDescriptorProto{
				Name:    proto.String("test.proto"),
				Package: proto.String("test"),
				MessageType: []*descriptorpb.DescriptorProto{
					{
						Name: proto.String("Record"),
						Field: []*descriptorpb.FieldDescriptorProto{
							{
								Name:     proto.String("snowflake_id"),
								JsonName: proto.String("snowflake_id,omitempty"),
								Number:   proto.Int32(1),
								Type:     descriptorpb.FieldDescriptorProto_Type(protoreflect.StringKind).Enum(),
							},
							{
								Name:     proto.String("occur_timestamp"),
								JsonName: proto.String("occur_timestamp,omitempty"),
								Number:   proto.Int32(2),
								Type:     descriptorpb.FieldDescriptorProto_Type(protoreflect.Int64Kind).Enum(),
							},
							{
								// usually we use google.protobuf.StringValue to do nullable string,
								// but use dynamic message it is too much painful to include it into the resolver scope.
								// so we'll instead use plain string.
								Name:     proto.String("from_system"),
								JsonName: proto.String("from_system,omitempty"),
								Number:   proto.Int32(3),
								Type:     descriptorpb.FieldDescriptorProto_Type(protoreflect.StringKind).Enum(),
							},
							{
								Name:     proto.String("action_type"),
								JsonName: proto.String("action_type,omitempty"),
								Number:   proto.Int32(4),
								Type:     descriptorpb.FieldDescriptorProto_Type(protoreflect.StringKind).Enum(),
							},
						},
					},
				},
				Syntax: proto.String("proto3"),
			}
			fd, err := protodesc.NewFile(fddef, nil)
			Expect(err).NotTo(HaveOccurred(), "%+v", err)
			md := fd.Messages().ByName("Record")

			return md
		}

Describe the solution you'd like My suggestion would be to replace all gogo/protobuf usage by the official google.golang.org/protobuf.

Per my understanding, this may require a re-generation of all generated pb.go files and some imports.

Thanks for your attention.

YanshuoH avatar Oct 12 '22 08:10 YanshuoH