parallel for the queue processing, up request semaphore, remove queue position (unused), bump api version

This commit is contained in:
rootdarkarchon
2023-01-15 01:44:10 +01:00
parent e968adb7be
commit 5e0e21ef68
3 changed files with 14 additions and 18 deletions

Submodule MareAPI updated: bd4c360a4f...f1c0fc76a9

View File

@@ -11,7 +11,7 @@ public class RequestController : ControllerBase
{ {
private readonly CachedFileProvider _cachedFileProvider; private readonly CachedFileProvider _cachedFileProvider;
private readonly RequestQueueService _requestQueue; private readonly RequestQueueService _requestQueue;
private static SemaphoreSlim _parallelRequestSemaphore = new(250); private static SemaphoreSlim _parallelRequestSemaphore = new(500);
public RequestController(ILogger<RequestController> logger, CachedFileProvider cachedFileProvider, RequestQueueService requestQueue, public RequestController(ILogger<RequestController> logger, CachedFileProvider cachedFileProvider, RequestQueueService requestQueue,
ServerTokenGenerator generator) : base(logger, generator) ServerTokenGenerator generator) : base(logger, generator)
@@ -73,9 +73,9 @@ public class RequestController : ControllerBase
return Ok(); return Ok();
} }
if (_requestQueue.StillEnqueued(requestId, MareUser, out int position)) if (_requestQueue.StillEnqueued(requestId, MareUser))
{ {
return Conflict(position); return Conflict();
} }
return BadRequest(); return BadRequest();

View File

@@ -66,17 +66,9 @@ public class RequestQueueService : IHostedService
throw new Exception("Error during EnqueueUser"); throw new Exception("Error during EnqueueUser");
} }
public bool StillEnqueued(Guid request, string user, out int queuePosition) public bool StillEnqueued(Guid request, string user)
{ {
var result = _queue.FirstOrDefault(c => c.RequestId == request && string.Equals(c.User, user, StringComparison.Ordinal)); return _queue.FirstOrDefault(c => c.RequestId == request && string.Equals(c.User, user, StringComparison.Ordinal)) != null;
if (result != null)
{
queuePosition = Array.IndexOf(_queue.ToArray(), result);
return true;
}
queuePosition = -1;
return false;
} }
public bool IsActiveProcessing(Guid request, string user, out UserRequest userRequest) public bool IsActiveProcessing(Guid request, string user, out UserRequest userRequest)
@@ -109,8 +101,14 @@ public class RequestQueueService : IHostedService
try try
{ {
for (int i = 0; i < _userQueueRequests.Length; i++) Parallel.For(0, _userQueueRequests.Length, new ParallelOptions()
{ {
MaxDegreeOfParallelism = 10
},
(i) =>
{
if (!_queue.Any()) return;
if (_userQueueRequests[i] != null && !_userQueueRequests[i].IsActive && _userQueueRequests[i].ExpirationDate < DateTime.UtcNow) _userQueueRequests[i] = null; if (_userQueueRequests[i] != null && !_userQueueRequests[i].IsActive && _userQueueRequests[i].ExpirationDate < DateTime.UtcNow) _userQueueRequests[i] = null;
if (_userQueueRequests[i] == null) if (_userQueueRequests[i] == null)
@@ -120,9 +118,7 @@ public class RequestQueueService : IHostedService
DequeueIntoSlot(request, i); DequeueIntoSlot(request, i);
} }
} }
});
if (!_queue.Any()) break;
}
} }
catch (Exception ex) catch (Exception ex)