YanshuoH opened a new issue, #862:
URL: https://github.com/apache/pulsar-client-go/issues/862

   **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
   ```
   
   <details>
   <summary>click to see the full logs</summary>
   
   ```
   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
   ```
   </details>
   
   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
   ```
   
   <details>
   <summary>Example code to create dynamic object</summary>
   
   ```
                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
                }
   ```
   </details>
   
   **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.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to