adjust queue processing

This commit is contained in:
rootdarkarchon
2023-08-02 11:37:34 +02:00
parent 255798c0c6
commit ba37a25869
4 changed files with 38 additions and 30 deletions

View File

@@ -9,28 +9,14 @@ public class RequestFileStreamResult : FileStreamResult
private readonly Guid _requestId;
private readonly RequestQueueService _requestQueueService;
private readonly MareMetrics _mareMetrics;
private readonly CancellationTokenSource _releaseCts = new();
private bool _releasedSlot = false;
public RequestFileStreamResult(Guid requestId, int secondsUntilRelease, RequestQueueService requestQueueService,
MareMetrics mareMetrics, Stream fileStream, string contentType) : base(fileStream, contentType)
public RequestFileStreamResult(Guid requestId, RequestQueueService requestQueueService, MareMetrics mareMetrics,
Stream fileStream, string contentType) : base(fileStream, contentType)
{
_requestId = requestId;
_requestQueueService = requestQueueService;
_mareMetrics = mareMetrics;
_mareMetrics.IncGauge(MetricsAPI.GaugeCurrentDownloads);
// forcefully release slot after secondsUntilRelease
_ = Task.Run(async () =>
{
try
{
await Task.Delay(TimeSpan.FromSeconds(secondsUntilRelease), _releaseCts.Token).ConfigureAwait(false);
_requestQueueService.FinishRequest(_requestId);
_releasedSlot = true;
}
catch { }
});
}
public override void ExecuteResult(ActionContext context)
@@ -45,10 +31,7 @@ public class RequestFileStreamResult : FileStreamResult
}
finally
{
_releaseCts.Cancel();
if (!_releasedSlot)
_requestQueueService.FinishRequest(_requestId);
_requestQueueService.FinishRequest(_requestId);
_mareMetrics.DecGauge(MetricsAPI.GaugeCurrentDownloads);
}
@@ -66,10 +49,7 @@ public class RequestFileStreamResult : FileStreamResult
}
finally
{
_releaseCts.Cancel();
if (!_releasedSlot)
_requestQueueService.FinishRequest(_requestId);
_requestQueueService.FinishRequest(_requestId);
_mareMetrics.DecGauge(MetricsAPI.GaugeCurrentDownloads);
}

View File

@@ -19,7 +19,7 @@ public class RequestFileStreamResultFactory
public RequestFileStreamResult Create(Guid requestId, MemoryStream ms)
{
return new RequestFileStreamResult(requestId, _configurationService.GetValueOrDefault(nameof(StaticFilesServerConfiguration.DownloadQueueReleaseSeconds), 15),
_requestQueueService, _metrics, ms, "application/octet-stream");
return new RequestFileStreamResult(requestId, _requestQueueService,
_metrics, ms, "application/octet-stream");
}
}

View File

@@ -1,6 +1,21 @@
namespace MareSynchronosStaticFilesServer.Utils;
public record UserQueueEntry(UserRequest UserRequest, DateTime ExpirationDate)
public class UserQueueEntry
{
public bool IsActive { get; set; } = false;
public UserQueueEntry(UserRequest userRequest, DateTime expirationDate)
{
UserRequest = userRequest;
ExpirationDate = expirationDate;
}
public void MarkActive()
{
IsActive = true;
ActivationDate = DateTime.UtcNow;
}
public UserRequest UserRequest { get; }
public DateTime ExpirationDate { get; }
public bool IsActive { get; private set; } = false;
public DateTime ActivationDate { get; private set; }
}