Moved NoGCRegion into middleware service
This commit is contained in:
@@ -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>();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user