From 3fc6b01df9b134c717181155d7ca2d9f505375dd Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Sun, 15 Jan 2023 00:52:21 +0100 Subject: [PATCH] adjust try/catch/finally for semaphore release --- .../Controllers/RequestController.cs | 68 ++++++++++++------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/RequestController.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/RequestController.cs index 7e9f8aa..a99eb2a 100644 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/RequestController.cs +++ b/MareSynchronosServer/MareSynchronosStaticFilesServer/Controllers/RequestController.cs @@ -24,46 +24,66 @@ public class RequestController : ControllerBase [Route(MareFiles.Request_Enqueue)] public async Task PreRequestFilesAsync([FromBody] List files) { - await _parallelRequestSemaphore.WaitAsync(HttpContext.RequestAborted); - foreach (var file in files) + try { - _logger.LogDebug("Prerequested file: " + file); - _cachedFileProvider.DownloadFileWhenRequired(file, Authorization); - } + await _parallelRequestSemaphore.WaitAsync(HttpContext.RequestAborted); + foreach (var file in files) + { + _logger.LogDebug("Prerequested file: " + file); + _cachedFileProvider.DownloadFileWhenRequired(file, Authorization); + } - _parallelRequestSemaphore.Release(); - return Ok(); + return Ok(); + } + catch (OperationCanceledException) { return BadRequest(); } + finally + { + _parallelRequestSemaphore.Release(); + } } [HttpGet] [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))); + try + { + await _parallelRequestSemaphore.WaitAsync(HttpContext.RequestAborted); + Guid g = Guid.NewGuid(); + _cachedFileProvider.DownloadFileWhenRequired(file, Authorization); + var queueStatus = await _requestQueue.EnqueueUser(new(g, MareUser, file)); + return Ok(JsonSerializer.Serialize(new QueueRequestDto(g, queueStatus))); + } + catch (OperationCanceledException) { return BadRequest(); } + finally + { + _parallelRequestSemaphore.Release(); + } } [HttpGet] [Route(MareFiles.Request_CheckQueue)] public async Task CheckQueueAsync(Guid requestId) { - await _parallelRequestSemaphore.WaitAsync(HttpContext.RequestAborted); - if (_requestQueue.IsActiveProcessing(requestId, MareUser, out _)) + try + { + await _parallelRequestSemaphore.WaitAsync(HttpContext.RequestAborted); + if (_requestQueue.IsActiveProcessing(requestId, MareUser, out _)) + { + return Ok(); + } + + if (_requestQueue.StillEnqueued(requestId, MareUser, out int position)) + { + return Conflict(position); + } + + return BadRequest(); + } + catch (OperationCanceledException) { return BadRequest(); } + finally { _parallelRequestSemaphore.Release(); - return Ok(); } - - if (_requestQueue.StillEnqueued(requestId, MareUser, out int position)) - { - _parallelRequestSemaphore.Release(); - return Conflict(position); - } - - return BadRequest(); } }