diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/RequestController.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/RequestController.cs index cd46315..7e9f8aa 100644 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/RequestController.cs +++ b/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/RequestController.cs @@ -11,6 +11,7 @@ public class RequestController : ControllerBase { private readonly CachedFileProvider _cachedFileProvider; private readonly RequestQueueService _requestQueue; + private static SemaphoreSlim _parallelRequestSemaphore = new(500); public RequestController(ILogger logger, CachedFileProvider cachedFileProvider, RequestQueueService requestQueue, ServerTokenGenerator generator) : base(logger, generator) @@ -21,14 +22,16 @@ public class RequestController : ControllerBase [HttpPost] [Route(MareFiles.Request_Enqueue)] - public IActionResult PreRequestFiles([FromBody] List files) + public async Task PreRequestFilesAsync([FromBody] List files) { + await _parallelRequestSemaphore.WaitAsync(HttpContext.RequestAborted); foreach (var file in files) { _logger.LogDebug("Prerequested file: " + file); _cachedFileProvider.DownloadFileWhenRequired(file, Authorization); } + _parallelRequestSemaphore.Release(); return Ok(); } @@ -36,19 +39,30 @@ public class RequestController : ControllerBase [Route(MareFiles.Request_RequestFile)] public async Task RequestFile(string file) { + await _parallelRequestSemaphore.WaitAsync(HttpContext.RequestAborted); Guid g = Guid.NewGuid(); _cachedFileProvider.DownloadFileWhenRequired(file, Authorization); var queueStatus = await _requestQueue.EnqueueUser(new(g, MareUser, file)); + _parallelRequestSemaphore.Release(); return Ok(JsonSerializer.Serialize(new QueueRequestDto(g, queueStatus))); } [HttpGet] [Route(MareFiles.Request_CheckQueue)] - public IActionResult CheckQueue(Guid requestId) + public async Task CheckQueueAsync(Guid requestId) { - if (_requestQueue.IsActiveProcessing(requestId, MareUser, out _)) return Ok(); + await _parallelRequestSemaphore.WaitAsync(HttpContext.RequestAborted); + if (_requestQueue.IsActiveProcessing(requestId, MareUser, out _)) + { + _parallelRequestSemaphore.Release(); + return Ok(); + } - if (_requestQueue.StillEnqueued(requestId, MareUser, out int position)) return Conflict(position); + if (_requestQueue.StillEnqueued(requestId, MareUser, out int position)) + { + _parallelRequestSemaphore.Release(); + return Conflict(position); + } return BadRequest(); }