ignore queue semaphore when processing queue

This commit is contained in:
rootdarkarchon
2023-01-15 01:10:35 +01:00
parent b230f12508
commit 60f6bb5829

View File

@@ -16,7 +16,6 @@ public class RequestQueueService : IHostedService
private readonly int _queueExpirationSeconds; private readonly int _queueExpirationSeconds;
private SemaphoreSlim _queueSemaphore = new(1); private SemaphoreSlim _queueSemaphore = new(1);
private SemaphoreSlim _queueProcessingSemaphore = new(1); private SemaphoreSlim _queueProcessingSemaphore = new(1);
private bool _isProcessingQueue = false;
private System.Timers.Timer _queueTimer; private System.Timers.Timer _queueTimer;
public RequestQueueService(MareMetrics metrics, IConfigurationService<StaticFilesServerConfiguration> configurationService, ILogger<RequestQueueService> logger) public RequestQueueService(MareMetrics metrics, IConfigurationService<StaticFilesServerConfiguration> configurationService, ILogger<RequestQueueService> logger)
@@ -104,13 +103,12 @@ public class RequestQueueService : IHostedService
private async void ProcessQueue(object src, ElapsedEventArgs e) private async void ProcessQueue(object src, ElapsedEventArgs e)
{ {
if (_isProcessingQueue) return; if (_queueProcessingSemaphore.CurrentCount == 0) return;
await _queueProcessingSemaphore.WaitAsync().ConfigureAwait(false);
_isProcessingQueue = true;
try try
{ {
await _queueProcessingSemaphore.WaitAsync().ConfigureAwait(false);
await _queueSemaphore.WaitAsync().ConfigureAwait(false);
for (int i = 0; i < _userQueueRequests.Length; i++) for (int i = 0; i < _userQueueRequests.Length; i++)
{ {
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;
@@ -134,11 +132,9 @@ public class RequestQueueService : IHostedService
finally finally
{ {
_queueProcessingSemaphore.Release(); _queueProcessingSemaphore.Release();
_queueSemaphore.Release();
} }
_metrics.SetGaugeTo(MetricsAPI.GaugeDownloadQueue, _queue.Count); _metrics.SetGaugeTo(MetricsAPI.GaugeDownloadQueue, _queue.Count);
_isProcessingQueue = false;
} }
private void DequeueIntoSlot(UserRequest userRequest, int slot) private void DequeueIntoSlot(UserRequest userRequest, int slot)