Moved NoGCRegion into middleware service

This commit is contained in:
Alex
2025-10-20 11:48:35 +01:00
parent 8aa29bf22b
commit d672130eeb
3 changed files with 83 additions and 87 deletions
+3 -46
View File
@@ -119,8 +119,6 @@ public static class Program
forwardedHeadersOptions.KnownProxies.Clear();
app.UseForwardedHeaders(forwardedHeadersOptions);
app.UseRequestTracking();
SetConsoleOutputMode();
await app.Services.GetRequiredService<SptServerStartupService>().Startup();
@@ -150,54 +148,13 @@ public static class Program
app.UseMiddleware<SptLoggerMiddleware>();
app.Use(async (context, next) => await HandleRequest(context, next));
app.UseNoGCRegions();
app.Use(async (context, next) => await context.RequestServices.GetRequiredService<HttpServer>().HandleRequest(context, next));
app.UseSptBlazor();
}
private static async Task HandleRequest(HttpContext context, RequestDelegate next)
{
var config = context.RequestServices.GetRequiredService<ConfigServer>().GetConfig<CoreConfig>();
// 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<HttpServer>().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(
@@ -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<ConfigServer>().GetConfig<CoreConfig>();
// 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<NoGCRegionMiddleware>();
}
}
@@ -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<RequestTrackingMiddleware>();
}
}