From 4122512f48763d118ada77c54d594645f0f0dd07 Mon Sep 17 00:00:00 2001 From: Vitalii Gridnev <gridnevvvit@gmail.com> Date: Wed, 2 Apr 2025 18:47:31 +0300 Subject: [PATCH] add compression to grpc server (#15939) --- ydb/core/driver_lib/run/run.cpp | 34 +++++++++++++++++++++++++++ ydb/core/protos/config.proto | 17 ++++++++++++++ ydb/library/grpc/server/grpc_server.h | 2 ++ 3 files changed, 53 insertions(+) diff --git a/ydb/core/driver_lib/run/run.cpp b/ydb/core/driver_lib/run/run.cpp index 30b9e40eb53c..3fd417f1daf7 100644 --- a/ydb/core/driver_lib/run/run.cpp +++ b/ydb/core/driver_lib/run/run.cpp @@ -946,6 +946,40 @@ void TKikimrRunner::InitializeGRpc(const TKikimrRunConfig& runConfig) { opts.SetMaxMessageSize(grpcConfig.HasMaxMessageSize() ? grpcConfig.GetMaxMessageSize() : NYdbGrpc::DEFAULT_GRPC_MESSAGE_SIZE_LIMIT); opts.SetMaxGlobalRequestInFlight(grpcConfig.GetMaxInFlight()); opts.SetLogger(NYdbGrpc::CreateActorSystemLogger(*ActorSystem.Get(), NKikimrServices::GRPC_SERVER)); + switch(grpcConfig.GetDefaultCompressionAlgorithm()) { + case NKikimrConfig::TGRpcConfig::YDB_GRPC_COMPRESS_NONE: { + opts.SetDefaultCompressionAlgorithm(GRPC_COMPRESS_NONE); + break; + } + case NKikimrConfig::TGRpcConfig::YDB_GRPC_COMPRESS_DEFLATE: { + opts.SetDefaultCompressionAlgorithm(GRPC_COMPRESS_DEFLATE); + break; + } + case NKikimrConfig::TGRpcConfig::YDB_GRPC_COMPRESS_GZIP: { + opts.SetDefaultCompressionAlgorithm(GRPC_COMPRESS_GZIP); + break; + } + } + + switch(grpcConfig.GetDefaultCompressionLevel()) { + case NKikimrConfig::TGRpcConfig::YDB_GRPC_COMPRESS_LEVEL_NONE: { + opts.SetDefaultCompressionLevel(GRPC_COMPRESS_LEVEL_NONE); + break; + } + + case NKikimrConfig::TGRpcConfig::YDB_GRPC_COMPRESS_LEVEL_LOW: { + opts.SetDefaultCompressionLevel(GRPC_COMPRESS_LEVEL_LOW); + break; + } + case NKikimrConfig::TGRpcConfig::YDB_GRPC_COMPRESS_LEVEL_MED: { + opts.SetDefaultCompressionLevel(GRPC_COMPRESS_LEVEL_MED); + break; + } + case NKikimrConfig::TGRpcConfig::YDB_GRPC_COMPRESS_LEVEL_HIGH: { + opts.SetDefaultCompressionLevel(GRPC_COMPRESS_LEVEL_HIGH); + break; + } + } if (appConfig.HasDomainsConfig() && appConfig.GetDomainsConfig().HasSecurityConfig() && diff --git a/ydb/core/protos/config.proto b/ydb/core/protos/config.proto index 7b289b2c1b04..50fc41e01ce6 100644 --- a/ydb/core/protos/config.proto +++ b/ydb/core/protos/config.proto @@ -717,6 +717,23 @@ message TGRpcConfig { repeated string RatelimiterServicesEnabled = 25; repeated string RatelimiterServicesDisabled = 26; + enum YdbGrpcCompressionAlgorithm { + YDB_GRPC_COMPRESS_NONE = 0; + YDB_GRPC_COMPRESS_DEFLATE = 1; + YDB_GRPC_COMPRESS_GZIP = 2; + }; + + optional YdbGrpcCompressionAlgorithm DefaultCompressionAlgorithm = 30 [default = YDB_GRPC_COMPRESS_NONE]; + + enum YdbGrpcCompressionLevel { + YDB_GRPC_COMPRESS_LEVEL_NONE = 0; + YDB_GRPC_COMPRESS_LEVEL_LOW = 1; + YDB_GRPC_COMPRESS_LEVEL_MED = 2; + YDB_GRPC_COMPRESS_LEVEL_HIGH = 3; + } + + optional YdbGrpcCompressionLevel DefaultCompressionLevel = 31 [default = YDB_GRPC_COMPRESS_LEVEL_NONE]; + // server socket options optional bool KeepAliveEnable = 100 [default = true]; // SO_KEEPALIVE optional uint32 KeepAliveIdleTimeoutTriggerSec = 101 [default = 90]; // TCP_KEEPIDLE diff --git a/ydb/library/grpc/server/grpc_server.h b/ydb/library/grpc/server/grpc_server.h index f09dc3ecaf6f..6777271b45e7 100644 --- a/ydb/library/grpc/server/grpc_server.h +++ b/ydb/library/grpc/server/grpc_server.h @@ -104,6 +104,8 @@ struct TServerOptions { // Mapping to particular compression algorithm depends on client. DECLARE_FIELD(DefaultCompressionLevel, grpc_compression_level, GRPC_COMPRESS_LEVEL_NONE); + DECLARE_FIELD(DefaultCompressionAlgorithm, grpc_compression_algorithm, GRPC_COMPRESS_NONE); + //! Custom configurator for ServerBuilder. DECLARE_FIELD(ServerBuilderMutator, std::function<void(grpc::ServerBuilder&)>, [](grpc::ServerBuilder&){});