diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..1857810 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,20 @@ +name: test + +on: + pull_request: + push: + branches: + - "develop" + +jobs: + test: + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-go@v5 + with: + go-version-file: go.mod + + - name: Test + run: go test ./... diff --git a/CHANGELOG.md b/CHANGELOG.md index 2351518..ea1bece 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +- Clients created with `NewClientConn` (and the `NewInternalClient`/`NewExternalClient` helpers) receive messages up to `dgrpc.MaxResponseSize` (2 GiB − 1 byte, `math.MaxInt32`) instead of 1 GiB. Standard servers send messages up to `dgrpc.MaxResponseSize`, the same as the grpc-go default. Request limits (client send, server receive) are unchanged. - Add zstd support for connectrpc server - Remove connectrpc error middleware by default. You need to add it `connectrpc.NewErrorsInterceptor` - Added abiliy to map connectrpc error diff --git a/client.go b/client.go index ddf6d24..0e94919 100644 --- a/client.go +++ b/client.go @@ -17,6 +17,7 @@ package dgrpc import ( "crypto/tls" "fmt" + "math" "time" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" @@ -31,7 +32,12 @@ var roundrobinDialOption = grpc.WithDefaultServiceConfig(`{"loadBalancingConfig" var insecureDialOption = grpc.WithTransportCredentials(insecure.NewCredentials()) var tlsClientDialOption = grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")) -var largeRecvMsgSizeCallOption = grpc.MaxCallRecvMsgSize(1024 * 1024 * 1024) +// MaxResponseSize is the largest gRPC response message in bytes that clients created by this +// package receive and that servers created by this package send. Requests keep the gRPC +// limits, they are expected to be small. +const MaxResponseSize = math.MaxInt32 + +var largeRecvMsgSizeCallOption = grpc.MaxCallRecvMsgSize(MaxResponseSize) var hangOnResolveErrorCallOption = grpc.WaitForReady(true) var hangOnResolveErrorDialOption = grpc.WithDefaultCallOptions(hangOnResolveErrorCallOption) @@ -86,7 +92,7 @@ func NewExternalClientConn(remoteAddr string, extraOpts ...grpc.DialOption) (*gr } // NewClientConn creates a default gRPC ClientConn with round robin, keepalive, OpenTelemetry tracing and -// large receive message size (max 1 GiB) configured. +// large receive message size (max [MaxResponseSize]) configured. // // If the remoteAddr starts with "xds://", it will use xDS credentials, transport credentials are not // configured and default gRPC applies which is full TLS. diff --git a/server/standard/server.go b/server/standard/server.go index 588cbc5..8cf3465 100644 --- a/server/standard/server.go +++ b/server/standard/server.go @@ -28,6 +28,7 @@ import ( grpc_zap "github.com/grpc-ecosystem/go-grpc-middleware/logging/zap" grpc_ctxtags "github.com/grpc-ecosystem/go-grpc-middleware/tags" grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + "github.com/streamingfast/dgrpc" "github.com/streamingfast/dgrpc/server" "github.com/streamingfast/dgrpc/server/tracelog" "github.com/streamingfast/shutter" @@ -410,6 +411,7 @@ func newGRPCServer(options *server.Options) *grpc.Server { s := grpc.NewServer( append([]grpc.ServerOption{ grpc.StatsHandler(otelgrpc.NewServerHandler(otelgrpc.WithTracerProvider(tracerProvider))), + grpc.MaxSendMsgSize(dgrpc.MaxResponseSize), grpc.KeepaliveEnforcementPolicy( keepalive.EnforcementPolicy{ MinTime: 15 * time.Second,