adjust queue processing
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user