diff --git a/contrib/rosetta/node/data.tar.gz b/contrib/rosetta/node/data.tar.gz index 4f31ed66a912..1bfc4ee1bce4 100644 Binary files a/contrib/rosetta/node/data.tar.gz and b/contrib/rosetta/node/data.tar.gz differ diff --git a/server/config/config.go b/server/config/config.go index 61a7ef809327..f817efb8e9f1 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -2,6 +2,7 @@ package config import ( "fmt" + "math" "strings" "github.com/spf13/viper" @@ -133,6 +134,14 @@ type GRPCConfig struct { // Address defines the API server to listen on Address string `mapstructure:"address"` + + // MaxRecvMsgSize defines the max message size in bytes the server can receive. + // The default value is 10MB. + MaxRecvMsgSize int `mapstructure:"max-recv-msg-size"` + + // MaxSendMsgSize defines the max message size in bytes the server can send. + // The default value is math.MaxInt32. + MaxSendMsgSize int `mapstructure:"max-send-msg-size"` } // GRPCWebConfig defines configuration for the gRPC-web server. @@ -224,8 +233,10 @@ func DefaultConfig() *Config { RPCMaxBodyBytes: 1000000, }, GRPC: GRPCConfig{ - Enable: true, - Address: DefaultGRPCAddress, + Enable: true, + Address: DefaultGRPCAddress, + MaxRecvMsgSize: 1024 * 1024 * 10, + MaxSendMsgSize: math.MaxInt32, }, Rosetta: RosettaConfig{ Enable: false, @@ -298,8 +309,10 @@ func GetConfig(v *viper.Viper) Config { Offline: v.GetBool("rosetta.offline"), }, GRPC: GRPCConfig{ - Enable: v.GetBool("grpc.enable"), - Address: v.GetString("grpc.address"), + Enable: v.GetBool("grpc.enable"), + Address: v.GetString("grpc.address"), + MaxRecvMsgSize: v.GetInt("grpc.max-recv-msg-size"), + MaxSendMsgSize: v.GetInt("grpc.max-send-msg-size"), }, GRPCWeb: GRPCWebConfig{ Enable: v.GetBool("grpc-web.enable"), diff --git a/server/config/toml.go b/server/config/toml.go index a4a6546805fe..97760a912e77 100644 --- a/server/config/toml.go +++ b/server/config/toml.go @@ -176,6 +176,14 @@ enable = {{ .GRPC.Enable }} # Address defines the gRPC server address to bind to. address = "{{ .GRPC.Address }}" +# MaxRecvMsgSize defines the max message size in bytes the server can receive. +# The default value is 4MB. +max-recv-msg-size = "{{ .GRPC.MaxRecvMsgSize }}" + +# MaxSendMsgSize defines the max message size in bytes the server can send. +# The default value is math.MaxInt32. +max-send-msg-size = "{{ .GRPC.MaxSendMsgSize }}" + ############################################################################### ### gRPC Web Configuration ### ############################################################################### diff --git a/server/grpc/server.go b/server/grpc/server.go index 0b41a57cd323..105f55d4751f 100644 --- a/server/grpc/server.go +++ b/server/grpc/server.go @@ -8,6 +8,7 @@ import ( "google.golang.org/grpc" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/server/config" "github.com/cosmos/cosmos-sdk/server/grpc/gogoreflection" reflection "github.com/cosmos/cosmos-sdk/server/grpc/reflection/v2alpha1" "github.com/cosmos/cosmos-sdk/server/types" @@ -15,17 +16,23 @@ import ( ) // StartGRPCServer starts a gRPC server on the given address. -func StartGRPCServer(clientCtx client.Context, app types.Application, address string) (*grpc.Server, error) { - grpcSrv := grpc.NewServer() +func StartGRPCServer(clientCtx client.Context, app types.Application, cfg config.GRPCConfig) (*grpc.Server, error) { + grpcSrv := grpc.NewServer( + grpc.MaxSendMsgSize(cfg.MaxSendMsgSize), + grpc.MaxRecvMsgSize(cfg.MaxRecvMsgSize), + ) app.RegisterGRPCServer(grpcSrv) - // reflection allows consumers to build dynamic clients that can write - // to any cosmos-sdk application without relying on application packages at compile time + + // Reflection allows consumers to build dynamic clients that can write to any + // Cosmos SDK application without relying on application packages at compile + // time. err := reflection.Register(grpcSrv, reflection.Config{ SigningModes: func() map[string]int32 { modes := make(map[string]int32, len(clientCtx.TxConfig.SignModeHandler().Modes())) for _, m := range clientCtx.TxConfig.SignModeHandler().Modes() { modes[m.String()] = (int32)(m) } + return modes }(), ChainID: clientCtx.ChainID, @@ -35,10 +42,12 @@ func StartGRPCServer(clientCtx client.Context, app types.Application, address st if err != nil { return nil, err } + // Reflection allows external clients to see what services and methods // the gRPC server exposes. gogoreflection.Register(grpcSrv) - listener, err := net.Listen("tcp", address) + + listener, err := net.Listen("tcp", cfg.Address) if err != nil { return nil, err } @@ -47,14 +56,16 @@ func StartGRPCServer(clientCtx client.Context, app types.Application, address st go func() { err = grpcSrv.Serve(listener) if err != nil { - errCh <- fmt.Errorf("failed to serve: %w", err) + errCh <- fmt.Errorf("failed to serve gRPC: %w", err) } }() select { case err := <-errCh: return nil, err - case <-time.After(types.ServerStartTime): // assume server started successfully + + case <-time.After(types.ServerStartTime): + // assume server started successfully return grpcSrv, nil } } diff --git a/server/start.go b/server/start.go index b49ebbfc36d9..a43f94e675c2 100644 --- a/server/start.go +++ b/server/start.go @@ -10,11 +10,7 @@ import ( "runtime/pprof" "time" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/spf13/cobra" - "google.golang.org/grpc" - "github.com/tendermint/tendermint/abci/server" tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" tmos "github.com/tendermint/tendermint/libs/os" @@ -23,18 +19,23 @@ import ( pvm "github.com/tendermint/tendermint/privval" "github.com/tendermint/tendermint/proxy" "github.com/tendermint/tendermint/rpc/client/local" - - "github.com/cosmos/cosmos-sdk/server/rosetta" - crgserver "github.com/cosmos/cosmos-sdk/server/rosetta/lib/server" + "google.golang.org/grpc" "google.golang.org/grpc/encoding" "google.golang.org/grpc/encoding/proto" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" +<<<<<<< HEAD pruningtypes "github.com/cosmos/cosmos-sdk/pruning/types" +======= + "github.com/cosmos/cosmos-sdk/codec" + pruningTypes "github.com/cosmos/cosmos-sdk/pruning/types" +>>>>>>> ca48456f7 (feat: support send and recv msg size for gRPC (#170)) "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servergrpc "github.com/cosmos/cosmos-sdk/server/grpc" + "github.com/cosmos/cosmos-sdk/server/rosetta" + crgserver "github.com/cosmos/cosmos-sdk/server/rosetta/lib/server" "github.com/cosmos/cosmos-sdk/server/types" ) @@ -312,7 +313,11 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App grpcClient, err := grpc.Dial( grpcAddress, grpc.WithInsecure(), - grpc.WithDefaultCallOptions(grpc.ForceCodec(encoding.GetCodec(proto.Name))), + grpc.WithDefaultCallOptions( + grpc.ForceCodec(encoding.GetCodec(proto.Name)), + grpc.MaxCallRecvMsgSize(config.GRPC.MaxRecvMsgSize), + grpc.MaxCallSendMsgSize(config.GRPC.MaxSendMsgSize), + ), ) if err != nil { return err @@ -343,7 +348,7 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App grpcWebSrv *http.Server ) if config.GRPC.Enable { - grpcSrv, err = servergrpc.StartGRPCServer(clientCtx, app, config.GRPC.Address) + grpcSrv, err = servergrpc.StartGRPCServer(clientCtx, app, config.GRPC) if err != nil { return err } diff --git a/testutil/network/util.go b/testutil/network/util.go index e7542113a87b..97d957e88686 100644 --- a/testutil/network/util.go +++ b/testutil/network/util.go @@ -98,7 +98,7 @@ func startInProcess(cfg Config, val *Validator) error { } if val.AppConfig.GRPC.Enable { - grpcSrv, err := servergrpc.StartGRPCServer(val.ClientCtx, app, val.AppConfig.GRPC.Address) + grpcSrv, err := servergrpc.StartGRPCServer(val.ClientCtx, app, val.AppConfig.GRPC) if err != nil { return err }