Skip to content

Commit

Permalink
allow to specify inactivity timeout for http connections (#12075)
Browse files Browse the repository at this point in the history
  • Loading branch information
adameat authored Nov 29, 2024
1 parent 3cf6c02 commit 9a20a06
Show file tree
Hide file tree
Showing 8 changed files with 11 additions and 4 deletions.
1 change: 1 addition & 0 deletions ydb/core/driver_lib/run/config_parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,7 @@ void TRunCommandConfigParser::ApplyParsedOptions() {
Config.AppConfig.MutableMonitoringConfig()->SetMonitoringAddress(RunOpts.MonitoringAddress);
Config.AppConfig.MutableMonitoringConfig()->SetMonitoringThreads(RunOpts.MonitoringThreads);
Config.AppConfig.MutableMonitoringConfig()->SetMaxRequestsPerSecond(RunOpts.MonitoringMaxRequestsPerSecond);
Config.AppConfig.MutableMonitoringConfig()->SetInactivityTimeout(ToString(RunOpts.MonitoringInactivityTimeout.Seconds()));
Config.AppConfig.MutableMonitoringConfig()->SetMonitoringCertificate(TUnbufferedFileInput(RunOpts.MonitoringCertificateFile).ReadAll());
Config.AppConfig.MutableRestartsCountConfig()->SetRestartsCountFile(RunOpts.RestartsCountFile);
}
Expand Down
1 change: 1 addition & 0 deletions ydb/core/driver_lib/run/config_parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ class TRunCommandConfigParser {
TString MonitoringCertificateFile;
ui32 MonitoringThreads;
ui32 MonitoringMaxRequestsPerSecond;
TDuration MonitoringInactivityTimeout;
TString RestartsCountFile;
bool StartTracingBusProxy;
TString TracePath;
Expand Down
1 change: 1 addition & 0 deletions ydb/core/driver_lib/run/run.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,7 @@ void TKikimrRunner::InitializeMonitoring(const TKikimrRunConfig& runConfig, bool
monConfig.Address = appConfig.GetMonitoringConfig().GetMonitoringAddress();
monConfig.Certificate = appConfig.GetMonitoringConfig().GetMonitoringCertificate();
monConfig.MaxRequestsPerSecond = appConfig.GetMonitoringConfig().GetMaxRequestsPerSecond();
monConfig.InactivityTimeout = TDuration::Parse(appConfig.GetMonitoringConfig().GetInactivityTimeout());
if (appConfig.GetMonitoringConfig().HasMonitoringCertificateFile()) {
monConfig.Certificate = TUnbufferedFileInput(appConfig.GetMonitoringConfig().GetMonitoringCertificateFile()).ReadAll();
}
Expand Down
1 change: 1 addition & 0 deletions ydb/core/mon/mon.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ class TMon {
TString RedirectMainPageTo;
TString Certificate;
ui32 MaxRequestsPerSecond = 0;
TDuration InactivityTimeout = TDuration::Minutes(2);
};

virtual ~TMon() = default;
Expand Down
1 change: 1 addition & 0 deletions ydb/core/protos/config.proto
Original file line number Diff line number Diff line change
Expand Up @@ -538,6 +538,7 @@ message TMonitoringConfig {
optional string MonitoringCertificateFile = 15;
optional string MemAllocDumpPathPrefix = 16;
optional uint32 MaxRequestsPerSecond = 17 [default = 0];
optional string InactivityTimeout = 18 [default = "2m"];
}

message TRestartsCountConfig {
Expand Down
2 changes: 2 additions & 0 deletions ydb/library/actors/http/http_proxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ struct TEvHttpProxy {
std::vector<TString> CompressContentTypes;
ui32 MaxRequestsPerSecond = 0;
ui32 MaxRecycledRequestsCount = DEFAULT_MAX_RECYCLED_REQUESTS_COUNT;
TDuration InactivityTimeout = TDuration::Minutes(2);

TEvAddListeningPort() = default;

Expand Down Expand Up @@ -251,6 +252,7 @@ struct TPrivateEndpointInfo : THttpEndpointInfo {
TActorId Owner;
TSslHelpers::TSslHolder<SSL_CTX> SecureContext;
TRateLimiter RateLimiter;
TDuration InactivityTimeout;

TPrivateEndpointInfo(const std::vector<TString>& compressContentTypes)
: THttpEndpointInfo(compressContentTypes)
Expand Down
1 change: 1 addition & 0 deletions ydb/library/actors/http/http_proxy_acceptor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ class TAcceptorActor : public NActors::TActor<TAcceptorActor>, public THttpConfi
Endpoint->Secure = event->Get()->Secure;
Endpoint->RateLimiter.Limit = event->Get()->MaxRequestsPerSecond;
Endpoint->RateLimiter.Period = TDuration::Seconds(1);
Endpoint->InactivityTimeout = event->Get()->InactivityTimeout;
int err = 0;
if (Endpoint->Secure) {
if (!event->Get()->SslCertificatePem.empty()) {
Expand Down
7 changes: 3 additions & 4 deletions ydb/library/actors/http/http_proxy_incoming.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ class TIncomingConnectionActor : public TActor<TIncomingConnectionActor<TSocketI
TDeque<THttpIncomingRequestPtr> RecycledRequests;

THPTimer InactivityTimer;
static constexpr TDuration InactivityTimeout = TDuration::Minutes(2);
TEvPollerReady* InactivityEvent = nullptr;

TPollerToken::TPtr PollerToken;
Expand Down Expand Up @@ -71,7 +70,7 @@ class TIncomingConnectionActor : public TActor<TIncomingConnectionActor<TSocketI
protected:
void Bootstrap(const TActorContext& ctx) {
InactivityTimer.Reset();
ctx.Schedule(InactivityTimeout, InactivityEvent = new TEvPollerReady(nullptr, false, false));
ctx.Schedule(Endpoint->InactivityTimeout, InactivityEvent = new TEvPollerReady(nullptr, false, false));
LOG_DEBUG_S(ctx, HttpLog, "(#" << TSocketImpl::GetRawSocket() << "," << Address << ") incoming connection opened");
OnAccept(ctx);
}
Expand Down Expand Up @@ -177,11 +176,11 @@ class TIncomingConnectionActor : public TActor<TIncomingConnectionActor<TSocketI
}
if (event->Get() == InactivityEvent) {
const TDuration passed = TDuration::Seconds(std::abs(InactivityTimer.Passed()));
if (passed >= InactivityTimeout) {
if (passed >= Endpoint->InactivityTimeout) {
LOG_DEBUG_S(ctx, HttpLog, "(#" << TSocketImpl::GetRawSocket() << "," << Address << ") connection closed by inactivity timeout");
return Die(ctx); // timeout
} else {
ctx.Schedule(InactivityTimeout - passed, InactivityEvent = new TEvPollerReady(nullptr, false, false));
ctx.Schedule(Endpoint->InactivityTimeout - passed, InactivityEvent = new TEvPollerReady(nullptr, false, false));
}
}
if (event->Get()->Write) {
Expand Down

0 comments on commit 9a20a06

Please sign in to comment.