diff --git a/ydb/core/http_proxy/http_service.cpp b/ydb/core/http_proxy/http_service.cpp index da629c498a90..1597ede3acf8 100644 --- a/ydb/core/http_proxy/http_service.cpp +++ b/ydb/core/http_proxy/http_service.cpp @@ -66,6 +66,7 @@ namespace NKikimr::NHttpProxy { const auto& config = Config.GetHttpConfig(); THolder ev = MakeHolder(config.GetPort()); + ev->MaxRecycledRequestsCount = 0; ev->Secure = config.GetSecure(); ev->CertificateFile = config.GetCert(); ev->PrivateKeyFile = config.GetKey(); diff --git a/ydb/library/actors/http/http_proxy.h b/ydb/library/actors/http/http_proxy.h index ac54266436fa..c61079ed21d8 100644 --- a/ydb/library/actors/http/http_proxy.h +++ b/ydb/library/actors/http/http_proxy.h @@ -16,6 +16,8 @@ namespace NHttp { +const ui32 DEFAULT_MAX_RECYCLED_REQUESTS_COUNT = 1000; + struct TSocketDescriptor : NActors::TSharedDescriptor, THttpConfig { SocketType Socket; @@ -65,6 +67,8 @@ struct TEvHttpProxy { TString SslCertificatePem; std::vector CompressContentTypes; + ui32 MaxRecycledRequestsCount = DEFAULT_MAX_RECYCLED_REQUESTS_COUNT; + TEvAddListeningPort() = default; TEvAddListeningPort(TIpPort port) diff --git a/ydb/library/actors/http/http_proxy_acceptor.cpp b/ydb/library/actors/http/http_proxy_acceptor.cpp index c007f747eb3e..0d44ea778fbd 100644 --- a/ydb/library/actors/http/http_proxy_acceptor.cpp +++ b/ydb/library/actors/http/http_proxy_acceptor.cpp @@ -13,6 +13,7 @@ class TAcceptorActor : public NActors::TActor, public THttpConfi NActors::TPollerToken::TPtr PollerToken; THashSet Connections; TDeque RecycledRequests; + ui32 MaxRecycledRequestsCount = 0; std::shared_ptr Endpoint; TAcceptorActor(const TActorId& owner, const TActorId& poller) @@ -43,6 +44,7 @@ class TAcceptorActor : public NActors::TActor, public THttpConfi void HandleInit(TEvHttpProxy::TEvAddListeningPort::TPtr event, const NActors::TActorContext& ctx) { TString address = event->Get()->Address; ui16 port = event->Get()->Port; + MaxRecycledRequestsCount = event->Get()->MaxRecycledRequestsCount; Socket = new TSocketDescriptor(SocketType::GuessAddressFamily(address)); // for unit tests :( SetSockOpt(Socket->Socket, SOL_SOCKET, SO_REUSEADDR, (int)true); @@ -141,6 +143,9 @@ class TAcceptorActor : public NActors::TActor, public THttpConfi void Handle(TEvHttpProxy::TEvHttpConnectionClosed::TPtr event, const NActors::TActorContext&) { Connections.erase(event->Get()->ConnectionID); for (auto& req : event->Get()->RecycledRequests) { + if (RecycledRequests.size() >= MaxRecycledRequestsCount) { + break; + } req->Clear(); RecycledRequests.push_back(std::move(req)); }