From d672130eebe3b09e6378dd4d52ab89d3d9d16c23 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 20 Oct 2025 11:48:35 +0100 Subject: [PATCH] Moved NoGCRegion into middleware service --- SPTarkov.Server/Program.cs | 49 +----------- .../Services/NoGCRegionMiddleware.cs | 80 +++++++++++++++++++ .../Services/RequestTrackingMiddleware.cs | 41 ---------- 3 files changed, 83 insertions(+), 87 deletions(-) create mode 100644 SPTarkov.Server/Services/NoGCRegionMiddleware.cs delete mode 100644 SPTarkov.Server/Services/RequestTrackingMiddleware.cs diff --git a/SPTarkov.Server/Program.cs b/SPTarkov.Server/Program.cs index d4b20351..3c7c4e3f 100644 --- a/SPTarkov.Server/Program.cs +++ b/SPTarkov.Server/Program.cs @@ -119,8 +119,6 @@ public static class Program forwardedHeadersOptions.KnownProxies.Clear(); app.UseForwardedHeaders(forwardedHeadersOptions); - app.UseRequestTracking(); - SetConsoleOutputMode(); await app.Services.GetRequiredService().Startup(); @@ -150,54 +148,13 @@ public static class Program app.UseMiddleware(); - app.Use(async (context, next) => await HandleRequest(context, next)); + app.UseNoGCRegions(); + + app.Use(async (context, next) => await context.RequestServices.GetRequiredService().HandleRequest(context, next)); app.UseSptBlazor(); } - private static async Task HandleRequest(HttpContext context, RequestDelegate next) - { - var config = context.RequestServices.GetRequiredService().GetConfig(); - - // if no other requests are running, start the no GC region, otherwise dont start it - if (!RequestTrackingMiddleware.OtherRequestsActive) - { - if (config.EnableNoGCRegions && GCSettings.LatencyMode != GCLatencyMode.NoGCRegion) - { - try - { - GC.TryStartNoGCRegion( - 1024L * 1024L * 1024L * config.NoGCRegionMaxMemoryGB, - 1024L * 1024L * 1024L * config.NoGCRegionMaxLOHMemoryGB, - true - ); - } - catch (Exception) - { - // ignored, we keep going - } - } - } - - await context.RequestServices.GetRequiredService().HandleRequest(context, next); - - // if no other requests are running, end the no GC region, otherwise dont stop it as other requests need it still - if (!RequestTrackingMiddleware.OtherRequestsActive) - { - if (config.EnableNoGCRegions && GCSettings.LatencyMode == GCLatencyMode.NoGCRegion) - { - try - { - GC.EndNoGCRegion(); - } - catch (Exception) - { - // ignored, we dont care about handling this - } - } - } - } - private static void ConfigureKestrel(WebApplicationBuilder builder) { builder.WebHost.ConfigureKestrel( diff --git a/SPTarkov.Server/Services/NoGCRegionMiddleware.cs b/SPTarkov.Server/Services/NoGCRegionMiddleware.cs new file mode 100644 index 00000000..99c27113 --- /dev/null +++ b/SPTarkov.Server/Services/NoGCRegionMiddleware.cs @@ -0,0 +1,80 @@ +using System.Runtime; +using SPTarkov.Server.Core.Models.Spt.Config; +using SPTarkov.Server.Core.Servers; + +namespace SPTarkov.Server.Services; + +// ReSharper disable once InconsistentNaming +public class NoGCRegionMiddleware(RequestDelegate next) +{ + private static int _activeRequests; + + private static bool OtherRequestsActive + { + get + { + return _activeRequests > 1; + } + } + + public async Task InvokeAsync(HttpContext context) + { + Interlocked.Increment(ref _activeRequests); + + var config = context.RequestServices.GetRequiredService().GetConfig(); + + // if no other requests are running, start the no GC region, otherwise dont start it + if (!OtherRequestsActive) + { + if (config.EnableNoGCRegions && GCSettings.LatencyMode != GCLatencyMode.NoGCRegion) + { + try + { + GC.TryStartNoGCRegion( + 1024L * 1024L * 1024L * config.NoGCRegionMaxMemoryGB, + 1024L * 1024L * 1024L * config.NoGCRegionMaxLOHMemoryGB, + true + ); + } + catch (Exception) + { + // ignored, we keep going + } + } + } + try + { + await next(context); + } + finally + { + Interlocked.Decrement(ref _activeRequests); + } + + // if no other requests are running, end the no GC region, otherwise dont stop it as other requests need it still + if (!OtherRequestsActive) + { + if (config.EnableNoGCRegions && GCSettings.LatencyMode == GCLatencyMode.NoGCRegion) + { + try + { + GC.EndNoGCRegion(); + } + catch (Exception) + { + // ignored, we dont care about handling this + } + } + } + } +} + +// ReSharper disable once InconsistentNaming +public static class NoGCRegionMiddlewareExtensions +{ + // ReSharper disable once InconsistentNaming + public static IApplicationBuilder UseNoGCRegions(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } +} diff --git a/SPTarkov.Server/Services/RequestTrackingMiddleware.cs b/SPTarkov.Server/Services/RequestTrackingMiddleware.cs deleted file mode 100644 index d24d1b0a..00000000 --- a/SPTarkov.Server/Services/RequestTrackingMiddleware.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace SPTarkov.Server.Services; - -public class RequestTrackingMiddleware -{ - private static int _activeRequests; - private readonly RequestDelegate _next; - - public static bool OtherRequestsActive - { - get - { - return _activeRequests > 1; - } - } - - public RequestTrackingMiddleware(RequestDelegate next) - { - _next = next; - } - - public async Task InvokeAsync(HttpContext context) - { - Interlocked.Increment(ref _activeRequests); - try - { - await _next(context); - } - finally - { - Interlocked.Decrement(ref _activeRequests); - } - } -} - -public static class RequestTrackingMiddlewareExtensions -{ - public static IApplicationBuilder UseRequestTracking(this IApplicationBuilder builder) - { - return builder.UseMiddleware(); - } -}