-
Notifications
You must be signed in to change notification settings - Fork 3.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(indexer): add to modules and implement proto fields #22544
Changes from 27 commits
24879d0
8047466
5a52970
ce8b931
86fc09a
7e5a665
4ebf63f
38fcf4c
ee06bf2
5381823
748bac9
3cd0277
4b3b800
0a73e70
ebd7397
5196e56
6ed03b5
6c03930
f4a3aa0
5bb37a3
de642e1
668838f
f3cd58f
80d762e
91674b1
228ffb5
e320f48
d94bde6
dc20c04
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -903,8 +903,12 @@ func (app *BaseApp) FinalizeBlock(req *abci.FinalizeBlockRequest) (res *abci.Fin | |||||||||||||||||||||||||||||||||
defer func() { | ||||||||||||||||||||||||||||||||||
// call the streaming service hooks with the FinalizeBlock messages | ||||||||||||||||||||||||||||||||||
for _, streamingListener := range app.streamingManager.ABCIListeners { | ||||||||||||||||||||||||||||||||||
if err := streamingListener.ListenFinalizeBlock(app.finalizeBlockState.Context(), *req, *res); err != nil { | ||||||||||||||||||||||||||||||||||
if streamErr := streamingListener.ListenFinalizeBlock(app.finalizeBlockState.Context(), *req, *res); streamErr != nil { | ||||||||||||||||||||||||||||||||||
app.logger.Error("ListenFinalizeBlock listening hook failed", "height", req.Height, "err", err) | ||||||||||||||||||||||||||||||||||
if app.streamingManager.StopNodeOnErr { | ||||||||||||||||||||||||||||||||||
// if StopNodeOnErr is set, we should return the streamErr in order to stop the node | ||||||||||||||||||||||||||||||||||
err = streamErr | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
facundomedica marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
}() | ||||||||||||||||||||||||||||||||||
|
@@ -976,12 +980,12 @@ func (app *BaseApp) Commit() (*abci.CommitResponse, error) { | |||||||||||||||||||||||||||||||||
rms.SetCommitHeader(header) | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
app.cms.Commit() | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
resp := &abci.CommitResponse{ | ||||||||||||||||||||||||||||||||||
RetainHeight: retainHeight, | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
app.cms.Commit() | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
Comment on lines
+987
to
+988
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Critical: Commit should occur after streaming listener. The commit operation should be moved after the streaming listener calls to ensure that any failures in the indexer can halt the node before committing changes. This prevents skipping blocks upon restart. Apply this diff to fix the ordering: -app.cms.Commit()
abciListeners := app.streamingManager.ABCIListeners
if len(abciListeners) > 0 {
ctx := app.finalizeBlockState.Context()
blockHeight := ctx.BlockHeight()
changeSet := app.cms.PopStateCache()
for _, abciListener := range abciListeners {
if err := abciListener.ListenCommit(ctx, *resp, changeSet); err != nil {
// ... error handling ...
}
}
}
+
+app.cms.Commit() 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||
abciListeners := app.streamingManager.ABCIListeners | ||||||||||||||||||||||||||||||||||
if len(abciListeners) > 0 { | ||||||||||||||||||||||||||||||||||
ctx := app.finalizeBlockState.Context() | ||||||||||||||||||||||||||||||||||
|
@@ -991,6 +995,13 @@ func (app *BaseApp) Commit() (*abci.CommitResponse, error) { | |||||||||||||||||||||||||||||||||
for _, abciListener := range abciListeners { | ||||||||||||||||||||||||||||||||||
if err := abciListener.ListenCommit(ctx, *resp, changeSet); err != nil { | ||||||||||||||||||||||||||||||||||
app.logger.Error("Commit listening hook failed", "height", blockHeight, "err", err) | ||||||||||||||||||||||||||||||||||
if app.streamingManager.StopNodeOnErr { | ||||||||||||||||||||||||||||||||||
rollbackErr := app.cms.RollbackToVersion(blockHeight - 1) | ||||||||||||||||||||||||||||||||||
if rollbackErr != nil { | ||||||||||||||||||||||||||||||||||
return nil, rollbackErr | ||||||||||||||||||||||||||||||||||
facundomedica marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
return nil, err | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
module cosmossdk.io/client/v2 | ||
|
||
go 1.23.1 | ||
go 1.23.3 | ||
|
||
require ( | ||
cosmossdk.io/api v0.7.6 | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,16 +1,23 @@ | ||||||||||||||||
package codec | ||||||||||||||||
|
||||||||||||||||
import ( | ||||||||||||||||
"encoding/json" | ||||||||||||||||
"fmt" | ||||||||||||||||
"reflect" | ||||||||||||||||
"strings" | ||||||||||||||||
|
||||||||||||||||
"github.com/cosmos/gogoproto/proto" | ||||||||||||||||
gogotypes "github.com/cosmos/gogoproto/types" | ||||||||||||||||
"google.golang.org/protobuf/encoding/protojson" | ||||||||||||||||
protov2 "google.golang.org/protobuf/proto" | ||||||||||||||||
"google.golang.org/protobuf/reflect/protoreflect" | ||||||||||||||||
"google.golang.org/protobuf/types/dynamicpb" | ||||||||||||||||
"google.golang.org/protobuf/types/known/durationpb" | ||||||||||||||||
"google.golang.org/protobuf/types/known/timestamppb" | ||||||||||||||||
|
||||||||||||||||
"cosmossdk.io/collections" | ||||||||||||||||
collcodec "cosmossdk.io/collections/codec" | ||||||||||||||||
"cosmossdk.io/schema" | ||||||||||||||||
) | ||||||||||||||||
|
||||||||||||||||
// BoolValue implements a ValueCodec that saves the bool value | ||||||||||||||||
|
@@ -51,12 +58,17 @@ type protoMessage[T any] interface { | |||||||||||||||
proto.Message | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
type protoCollValueCodec[T any] interface { | ||||||||||||||||
collcodec.HasSchemaCodec[T] | ||||||||||||||||
collcodec.ValueCodec[T] | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
// CollValue inits a collections.ValueCodec for a generic gogo protobuf message. | ||||||||||||||||
func CollValue[T any, PT protoMessage[T]](cdc interface { | ||||||||||||||||
Marshal(proto.Message) ([]byte, error) | ||||||||||||||||
Unmarshal([]byte, proto.Message) error | ||||||||||||||||
}, | ||||||||||||||||
) collcodec.ValueCodec[T] { | ||||||||||||||||
) protoCollValueCodec[T] { | ||||||||||||||||
return &collValue[T, PT]{cdc.(Codec), proto.MessageName(PT(new(T)))} | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
|
@@ -91,6 +103,139 @@ func (c collValue[T, PT]) ValueType() string { | |||||||||||||||
return "github.com/cosmos/gogoproto/" + c.messageName | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
func (c collValue[T, PT]) SchemaCodec() (collcodec.SchemaCodec[T], error) { | ||||||||||||||||
var ( | ||||||||||||||||
t T | ||||||||||||||||
pt PT | ||||||||||||||||
) | ||||||||||||||||
msgName := proto.MessageName(pt) | ||||||||||||||||
desc, err := proto.HybridResolver.FindDescriptorByName(protoreflect.FullName(msgName)) | ||||||||||||||||
if err != nil { | ||||||||||||||||
return collcodec.SchemaCodec[T]{}, fmt.Errorf("could not find descriptor for %s: %w", msgName, err) | ||||||||||||||||
} | ||||||||||||||||
schemaFields := protoCols(desc.(protoreflect.MessageDescriptor)) | ||||||||||||||||
|
||||||||||||||||
kind := schema.KindForGoValue(t) | ||||||||||||||||
if err := kind.Validate(); err == nil { | ||||||||||||||||
return collcodec.SchemaCodec[T]{ | ||||||||||||||||
Fields: []schema.Field{{ | ||||||||||||||||
// we don't set any name so that this can be set to a good default by the caller | ||||||||||||||||
Name: "", | ||||||||||||||||
Kind: kind, | ||||||||||||||||
}}, | ||||||||||||||||
// these can be nil because T maps directly to a schema value for this kind | ||||||||||||||||
ToSchemaType: nil, | ||||||||||||||||
FromSchemaType: nil, | ||||||||||||||||
}, nil | ||||||||||||||||
} else { | ||||||||||||||||
return collcodec.SchemaCodec[T]{ | ||||||||||||||||
Fields: schemaFields, | ||||||||||||||||
ToSchemaType: func(t T) (any, error) { | ||||||||||||||||
values := []interface{}{} | ||||||||||||||||
msgDesc, ok := desc.(protoreflect.MessageDescriptor) | ||||||||||||||||
if !ok { | ||||||||||||||||
return nil, fmt.Errorf("expected message descriptor, got %T", desc) | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
nm := dynamicpb.NewMessage(msgDesc) | ||||||||||||||||
bz, err := c.cdc.Marshal(any(&t).(PT)) | ||||||||||||||||
if err != nil { | ||||||||||||||||
return nil, err | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
err = c.cdc.Unmarshal(bz, nm) | ||||||||||||||||
if err != nil { | ||||||||||||||||
return nil, err | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
for _, field := range schemaFields { | ||||||||||||||||
// Find the field descriptor by the Protobuf field name | ||||||||||||||||
fieldDesc := msgDesc.Fields().ByName(protoreflect.Name(field.Name)) | ||||||||||||||||
if fieldDesc == nil { | ||||||||||||||||
return nil, fmt.Errorf("field %q not found in message %s", field.Name, desc.FullName()) | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
val := nm.ProtoReflect().Get(fieldDesc) | ||||||||||||||||
|
||||||||||||||||
// if the field is a map or list, we need to convert it to a slice of values | ||||||||||||||||
if fieldDesc.IsList() { | ||||||||||||||||
repeatedVals := []interface{}{} | ||||||||||||||||
list := val.List() | ||||||||||||||||
for i := 0; i < list.Len(); i++ { | ||||||||||||||||
repeatedVals = append(repeatedVals, list.Get(i).Interface()) | ||||||||||||||||
} | ||||||||||||||||
values = append(values, repeatedVals) | ||||||||||||||||
continue | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
switch fieldDesc.Kind() { | ||||||||||||||||
case protoreflect.BoolKind: | ||||||||||||||||
values = append(values, val.Bool()) | ||||||||||||||||
case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind, | ||||||||||||||||
protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: | ||||||||||||||||
values = append(values, val.Int()) | ||||||||||||||||
case protoreflect.Uint32Kind, protoreflect.Fixed32Kind, protoreflect.Uint64Kind, | ||||||||||||||||
protoreflect.Fixed64Kind: | ||||||||||||||||
values = append(values, val.Uint()) | ||||||||||||||||
case protoreflect.FloatKind, protoreflect.DoubleKind: | ||||||||||||||||
values = append(values, val.Float()) | ||||||||||||||||
case protoreflect.StringKind: | ||||||||||||||||
values = append(values, val.String()) | ||||||||||||||||
case protoreflect.BytesKind: | ||||||||||||||||
values = append(values, val.Bytes()) | ||||||||||||||||
case protoreflect.EnumKind: | ||||||||||||||||
// TODO: postgres uses the enum name, not the number | ||||||||||||||||
values = append(values, string(fieldDesc.Enum().Values().ByNumber(val.Enum()).Name())) | ||||||||||||||||
case protoreflect.MessageKind: | ||||||||||||||||
msg := val.Interface().(*dynamicpb.Message) | ||||||||||||||||
msgbz, err := c.cdc.Marshal(msg) | ||||||||||||||||
if err != nil { | ||||||||||||||||
return nil, err | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
if field.Kind == schema.TimeKind { | ||||||||||||||||
// make it a time.Time | ||||||||||||||||
ts := ×tamppb.Timestamp{} | ||||||||||||||||
err = c.cdc.Unmarshal(msgbz, ts) | ||||||||||||||||
if err != nil { | ||||||||||||||||
return nil, fmt.Errorf("error unmarshalling timestamp: %w %x %s", err, msgbz, fieldDesc.FullName()) | ||||||||||||||||
} | ||||||||||||||||
values = append(values, ts.AsTime()) | ||||||||||||||||
} else if field.Kind == schema.DurationKind { | ||||||||||||||||
// make it a time.Duration | ||||||||||||||||
dur := &durationpb.Duration{} | ||||||||||||||||
err = c.cdc.Unmarshal(msgbz, dur) | ||||||||||||||||
if err != nil { | ||||||||||||||||
return nil, fmt.Errorf("error unmarshalling duration: %w", err) | ||||||||||||||||
} | ||||||||||||||||
values = append(values, dur.AsDuration()) | ||||||||||||||||
} else { | ||||||||||||||||
// if not a time or duration, just keep it as a JSON object | ||||||||||||||||
// we might want to change this to include the entire object as separate fields | ||||||||||||||||
bz, err := c.cdc.MarshalJSON(msg) | ||||||||||||||||
if err != nil { | ||||||||||||||||
return nil, fmt.Errorf("error marshaling message: %w", err) | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
values = append(values, json.RawMessage(bz)) | ||||||||||||||||
} | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
// if there's only one value, return it directly | ||||||||||||||||
if len(values) == 1 { | ||||||||||||||||
return values[0], nil | ||||||||||||||||
} | ||||||||||||||||
return values, nil | ||||||||||||||||
}, | ||||||||||||||||
FromSchemaType: func(a any) (T, error) { | ||||||||||||||||
panic("not implemented") | ||||||||||||||||
}, | ||||||||||||||||
Comment on lines
+232
to
+234
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Avoid using Using Apply this diff to replace the panic with an error return: func(a any) (T, error) {
- panic("not implemented")
+ return T{}, fmt.Errorf("FromSchemaType is not implemented")
}, 📝 Committable suggestion
Suggested change
|
||||||||||||||||
}, nil | ||||||||||||||||
} | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
type protoMessageV2[T any] interface { | ||||||||||||||||
*T | ||||||||||||||||
protov2.Message | ||||||||||||||||
|
@@ -179,3 +324,101 @@ func (c collInterfaceValue[T]) ValueType() string { | |||||||||||||||
var t T | ||||||||||||||||
return fmt.Sprintf("%T", t) | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
// SchemaCodec returns a schema codec, which will always have a single JSON field | ||||||||||||||||
// as there is no way to know in advance the necessary fields for an interface. | ||||||||||||||||
func (c collInterfaceValue[T]) SchemaCodec() (collcodec.SchemaCodec[T], error) { | ||||||||||||||||
var pt T | ||||||||||||||||
|
||||||||||||||||
kind := schema.KindForGoValue(pt) | ||||||||||||||||
if err := kind.Validate(); err == nil { | ||||||||||||||||
return collcodec.SchemaCodec[T]{ | ||||||||||||||||
Fields: []schema.Field{{ | ||||||||||||||||
// we don't set any name so that this can be set to a good default by the caller | ||||||||||||||||
Name: "", | ||||||||||||||||
Kind: kind, | ||||||||||||||||
}}, | ||||||||||||||||
// these can be nil because T maps directly to a schema value for this kind | ||||||||||||||||
ToSchemaType: nil, | ||||||||||||||||
FromSchemaType: nil, | ||||||||||||||||
}, nil | ||||||||||||||||
} else { | ||||||||||||||||
return collcodec.SchemaCodec[T]{ | ||||||||||||||||
Fields: []schema.Field{{ | ||||||||||||||||
Name: "value", | ||||||||||||||||
Kind: schema.JSONKind, | ||||||||||||||||
}}, | ||||||||||||||||
ToSchemaType: func(t T) (any, error) { | ||||||||||||||||
bz, err := c.codec.MarshalInterfaceJSON(t) | ||||||||||||||||
if err != nil { | ||||||||||||||||
return nil, err | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
return json.RawMessage(bz), nil | ||||||||||||||||
}, | ||||||||||||||||
FromSchemaType: func(a any) (T, error) { | ||||||||||||||||
panic("not implemented") | ||||||||||||||||
}, | ||||||||||||||||
Comment on lines
+359
to
+361
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Avoid using The use of Apply this diff to replace the panic with an error return: func(a any) (T, error) {
- panic("not implemented")
+ var t T
+ return t, fmt.Errorf("FromSchemaType is not implemented")
}, 📝 Committable suggestion
Suggested change
|
||||||||||||||||
}, nil | ||||||||||||||||
} | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
func protoCols(desc protoreflect.MessageDescriptor) []schema.Field { | ||||||||||||||||
nFields := desc.Fields() | ||||||||||||||||
cols := make([]schema.Field, 0, nFields.Len()) | ||||||||||||||||
for i := 0; i < nFields.Len(); i++ { | ||||||||||||||||
f := nFields.Get(i) | ||||||||||||||||
cols = append(cols, protoCol(f)) | ||||||||||||||||
} | ||||||||||||||||
return cols | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
func protoCol(f protoreflect.FieldDescriptor) schema.Field { | ||||||||||||||||
col := schema.Field{Name: string(f.Name())} | ||||||||||||||||
if f.IsMap() || f.IsList() { | ||||||||||||||||
col.Kind = schema.JSONKind | ||||||||||||||||
col.Nullable = true | ||||||||||||||||
} else { | ||||||||||||||||
switch f.Kind() { | ||||||||||||||||
case protoreflect.BoolKind: | ||||||||||||||||
col.Kind = schema.BoolKind | ||||||||||||||||
case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: | ||||||||||||||||
col.Kind = schema.Int32Kind | ||||||||||||||||
case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: | ||||||||||||||||
col.Kind = schema.Int64Kind | ||||||||||||||||
case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: | ||||||||||||||||
col.Kind = schema.Int64Kind | ||||||||||||||||
case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: | ||||||||||||||||
col.Kind = schema.Uint64Kind | ||||||||||||||||
case protoreflect.FloatKind: | ||||||||||||||||
col.Kind = schema.Float32Kind | ||||||||||||||||
case protoreflect.DoubleKind: | ||||||||||||||||
col.Kind = schema.Float64Kind | ||||||||||||||||
case protoreflect.StringKind: | ||||||||||||||||
col.Kind = schema.StringKind | ||||||||||||||||
case protoreflect.BytesKind: | ||||||||||||||||
col.Kind = schema.BytesKind | ||||||||||||||||
case protoreflect.EnumKind: | ||||||||||||||||
// TODO: support enums | ||||||||||||||||
col.Kind = schema.EnumKind | ||||||||||||||||
// use the full name to avoid collissions | ||||||||||||||||
col.ReferencedType = string(f.Enum().FullName()) | ||||||||||||||||
col.ReferencedType = strings.ReplaceAll(col.ReferencedType, ".", "_") | ||||||||||||||||
case protoreflect.MessageKind: | ||||||||||||||||
col.Nullable = true | ||||||||||||||||
fullName := f.Message().FullName() | ||||||||||||||||
if fullName == "google.protobuf.Timestamp" { | ||||||||||||||||
col.Kind = schema.TimeKind | ||||||||||||||||
} else if fullName == "google.protobuf.Duration" { | ||||||||||||||||
col.Kind = schema.DurationKind | ||||||||||||||||
} else { | ||||||||||||||||
col.Kind = schema.JSONKind | ||||||||||||||||
} | ||||||||||||||||
} | ||||||||||||||||
if f.HasPresence() { | ||||||||||||||||
col.Nullable = true | ||||||||||||||||
} | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
return col | ||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,22 @@ | ||
module cosmossdk.io/collections | ||
|
||
go 1.23 | ||
go 1.23.2 | ||
|
||
require ( | ||
cosmossdk.io/core v1.0.0-alpha.6 | ||
cosmossdk.io/core/testing v0.0.0-20240923163230-04da382a9f29 | ||
cosmossdk.io/schema v0.3.0 | ||
github.com/cosmos/gogoproto v1.7.0 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Codebase verification Update google.golang.org/protobuf to address security vulnerability The codebase extensively uses
🔗 Analysis chainVerify protobuf version compatibility The PR adds protobuf-related dependencies which align with the implementation of proto fields. However, let's verify if we're using the latest stable version of Also applies to: 14-14 Update google.golang.org/protobuf to v1.33.0 or later The current version v1.35.2 is vulnerable to a moderate severity issue (infinite loop in protojson.Unmarshal) that was patched in v1.33.0. While v1.35.2 is actually the latest version available, it still contains this vulnerability according to the GitHub Security Advisory database. This suggests there might be a discrepancy in the version information, and it would be prudent to verify this further. 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Check latest version of google.golang.org/protobuf
curl -s "https://proxy.golang.org/google.golang.org/protobuf/@v/list" | sort -V | tail -n 1
# Check if there are any known issues with the current version
gh api graphql -f query='
{
securityVulnerabilities(first: 5, ecosystem: GO, package: "google.golang.org/protobuf") {
nodes {
advisory {
summary
severity
publishedAt
}
vulnerableVersionRange
firstPatchedVersion {
identifier
}
}
}
}'
Length of output: 974 Script: #!/bin/bash
# Double check the version information from go.mod
rg "google.golang.org/protobuf" -A 1 -B 1 go.mod
# Check if protojson.Unmarshal is actually used in the codebase
rg "protojson\.Unmarshal"
Length of output: 1499 |
||
github.com/stretchr/testify v1.10.0 | ||
github.com/tidwall/btree v1.7.0 | ||
google.golang.org/protobuf v1.35.2 | ||
pgregory.net/rapid v1.1.0 | ||
) | ||
|
||
require ( | ||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect | ||
github.com/pmezard/go-difflib v1.0.0 // indirect | ||
github.com/golang/protobuf v1.5.4 // indirect | ||
github.com/google/go-cmp v0.6.0 // indirect | ||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect | ||
gopkg.in/yaml.v3 v3.0.1 // indirect | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
doesn't this get override line 937? Shouldn't we return the error as the comment says?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is inside a defer, so it will replace the one we are returning
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see yeah, so I suppose we should join it too right?