From e11c972f3a5cc761176df818ee7ee06cd6a11578 Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Tue, 9 Aug 2022 11:07:37 +0000 Subject: [PATCH 1/3] Test billingService can receive large messages Add a test to ensure that the gRPC server can receive very large message payloads. Use the billing RPC service `UpdateInvoices` RPC as the RPC to call as that is the one we see failing in production. --- components/usage/pkg/apiv1/size_test.go | 59 +++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 components/usage/pkg/apiv1/size_test.go diff --git a/components/usage/pkg/apiv1/size_test.go b/components/usage/pkg/apiv1/size_test.go new file mode 100644 index 00000000000000..757887acc6059e --- /dev/null +++ b/components/usage/pkg/apiv1/size_test.go @@ -0,0 +1,59 @@ +// Copyright (c) 2022 Gitpod GmbH. All rights reserved. +// Licensed under the GNU Affero General Public License (AGPL). +// See License-AGPL.txt in the project root for license information. + +package apiv1 + +import ( + "context" + "testing" + "time" + + "github.com/gitpod-io/gitpod/common-go/baseserver" + v1 "github.com/gitpod-io/gitpod/usage-api/v1" + "github.com/gitpod-io/gitpod/usage/pkg/stripe" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +func TestServerCanReceiveLargeMessages(t *testing.T) { + srv := baseserver.NewForTests(t, + baseserver.WithGRPC(baseserver.MustUseRandomLocalAddress(t)), + ) + + v1.RegisterBillingServiceServer(srv.GRPC(), NewBillingService(&stripe.Client{}, time.Time{})) + baseserver.StartServerForTests(t, srv) + + conn, err := grpc.Dial(srv.GRPCAddress(), grpc.WithTransportCredentials(insecure.NewCredentials())) + require.NoError(t, err) + + client := v1.NewBillingServiceClient(conn) + + _, err = client.UpdateInvoices(context.Background(), &v1.UpdateInvoicesRequest{ + Sessions: getBilledSessions(), + }) + + require.NoError(t, err) +} + +func getBilledSessions() (sessions []*v1.BilledSession) { + for i := 0; i < 900000; i++ { + sessions = append(sessions, &v1.BilledSession{ + AttributionId: "user:1234", + UserId: "1234", + TeamId: "", + WorkspaceId: "", + WorkspaceType: "", + ProjectId: "", + InstanceId: "", + WorkspaceClass: "", + StartTime: ×tamppb.Timestamp{}, + EndTime: ×tamppb.Timestamp{}, + CreditsDeprecated: 0, + Credits: 0, + }) + } + return +} From 3606f87a1ca2b6bc40ae9682569c892486474a60 Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Tue, 9 Aug 2022 09:58:26 +0000 Subject: [PATCH 2/3] Set baseserver gRPC max receive message size Allow the gRPC server to receive messages up to 100MB in size. --- components/common-go/baseserver/server.go | 1 + 1 file changed, 1 insertion(+) diff --git a/components/common-go/baseserver/server.go b/components/common-go/baseserver/server.go index d510ac9ca86725..36f38afc544329 100644 --- a/components/common-go/baseserver/server.go +++ b/components/common-go/baseserver/server.go @@ -298,6 +298,7 @@ func (s *Server) initializeGRPC() error { opts = append(opts, grpc.Creds(credentials.NewTLS(tlsConfig))) } + opts = append(opts, grpc.MaxRecvMsgSize(100*1024*1024)) s.grpc = grpc.NewServer(opts...) reflection.Register(s.grpc) From a1d9422caf1876cf6234380f2544e15d43a84d67 Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Tue, 9 Aug 2022 12:16:12 +0000 Subject: [PATCH 3/3] Set client send and receive message sizes --- components/usage/pkg/server/server.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/usage/pkg/server/server.go b/components/usage/pkg/server/server.go index 1c85f5887bfc31..7ef5b1ea52d28f 100644 --- a/components/usage/pkg/server/server.go +++ b/components/usage/pkg/server/server.go @@ -76,8 +76,8 @@ func Start(cfg Config) error { grpc.WithUnaryInterceptor(grpcClientMetrics.UnaryClientInterceptor()), grpc.WithStreamInterceptor(grpcClientMetrics.StreamClientInterceptor()), grpc.WithDefaultCallOptions( - grpc.MaxCallRecvMsgSize(50*1024*1024), - grpc.MaxCallSendMsgSize(50*1024*1024), + grpc.MaxCallRecvMsgSize(100*1024*1024), + grpc.MaxCallSendMsgSize(100*1024*1024), )) if err != nil { return fmt.Errorf("failed to create self-connection to grpc server: %w", err)