add alias to jwt, remove caching from auth, remove db usage from files

This commit is contained in:
rootdarkarchon
2024-01-14 11:57:18 +01:00
parent 2c7ff6f73a
commit 63286127a2
7 changed files with 35 additions and 98 deletions

View File

@@ -14,4 +14,5 @@ public class ControllerBase : Controller
protected string MareUser => HttpContext.User.Claims.First(f => string.Equals(f.Type, MareClaimTypes.Uid, StringComparison.Ordinal)).Value;
protected string Continent => HttpContext.User.Claims.FirstOrDefault(f => string.Equals(f.Type, MareClaimTypes.Continent, StringComparison.Ordinal))?.Value ?? "*";
protected bool IsPriority => !string.IsNullOrEmpty(HttpContext.User.Claims.FirstOrDefault(f => string.Equals(f.Type, MareClaimTypes.Alias, StringComparison.Ordinal))?.Value ?? string.Empty);
}

View File

@@ -1,5 +1,4 @@
using MareSynchronos.API.Routes;
using MareSynchronosShared.Data;
using MareSynchronosStaticFilesServer.Services;
using Microsoft.AspNetCore.Mvc;
@@ -10,14 +9,12 @@ public class RequestController : ControllerBase
{
private readonly CachedFileProvider _cachedFileProvider;
private readonly RequestQueueService _requestQueue;
private readonly MareDbContext _mareDbContext;
private static readonly SemaphoreSlim _parallelRequestSemaphore = new(500);
public RequestController(ILogger<RequestController> logger, CachedFileProvider cachedFileProvider, RequestQueueService requestQueue, MareDbContext mareDbContext) : base(logger)
public RequestController(ILogger<RequestController> logger, CachedFileProvider cachedFileProvider, RequestQueueService requestQueue) : base(logger)
{
_cachedFileProvider = cachedFileProvider;
_requestQueue = requestQueue;
_mareDbContext = mareDbContext;
}
[HttpGet]
@@ -28,7 +25,7 @@ public class RequestController : ControllerBase
try
{
_requestQueue.RemoveFromQueue(requestId, MareUser);
_requestQueue.RemoveFromQueue(requestId, MareUser, IsPriority);
return Ok();
}
catch (OperationCanceledException) { return BadRequest(); }
@@ -53,7 +50,7 @@ public class RequestController : ControllerBase
}
Guid g = Guid.NewGuid();
await _requestQueue.EnqueueUser(new(g, MareUser, files.ToList()), _mareDbContext);
_requestQueue.EnqueueUser(new(g, MareUser, files.ToList()), IsPriority);
return Ok(g);
}
@@ -72,8 +69,8 @@ public class RequestController : ControllerBase
try
{
if (!await _requestQueue.StillEnqueued(requestId, MareUser, _mareDbContext))
await _requestQueue.EnqueueUser(new(requestId, MareUser, files.ToList()), _mareDbContext);
if (!_requestQueue.StillEnqueued(requestId, MareUser, IsPriority))
_requestQueue.EnqueueUser(new(requestId, MareUser, files.ToList()), IsPriority);
return Ok();
}
catch (OperationCanceledException) { return BadRequest(); }

View File

@@ -5,9 +5,6 @@ using Microsoft.AspNetCore.SignalR;
using System.Collections.Concurrent;
using System.Timers;
using MareSynchronos.API.SignalR;
using MareSynchronosShared.Data;
using Microsoft.EntityFrameworkCore;
using System.Linq;
namespace MareSynchronosStaticFilesServer.Services;
@@ -24,7 +21,6 @@ public class RequestQueueService : IHostedService
private readonly SemaphoreSlim _queueProcessingSemaphore = new(1);
private readonly SemaphoreSlim _queueSemaphore = new(1);
private readonly UserQueueEntry[] _userQueueRequests;
private readonly ConcurrentDictionary<string, PriorityEntry> _priorityCache = new(StringComparer.Ordinal);
private int _queueLimitForReset;
private readonly int _queueReleaseSeconds;
private System.Timers.Timer _queueTimer;
@@ -48,49 +44,11 @@ public class RequestQueueService : IHostedService
req.MarkActive();
}
private async Task<bool> IsHighPriority(string uid, MareDbContext mareDbContext)
{
if (!_priorityCache.TryGetValue(uid, out PriorityEntry entry) || entry.LastChecked.Add(TimeSpan.FromHours(6)) < DateTime.UtcNow)
{
var user = await mareDbContext.Users.FirstOrDefaultAsync(u => u.UID == uid).ConfigureAwait(false);
entry = new(user != null && !string.IsNullOrEmpty(user.Alias), DateTime.UtcNow);
_priorityCache[uid] = entry;
}
return entry.IsHighPriority;
}
public async Task EnqueueUser(UserRequest request, MareDbContext mareDbContext)
public void EnqueueUser(UserRequest request, bool isPriority)
{
_logger.LogDebug("Enqueueing req {guid} from {user} for {file}", request.RequestId, request.User, string.Join(", ", request.FileIds));
bool isPriorityQueue = await IsHighPriority(request.User, mareDbContext).ConfigureAwait(false);
if (_queueProcessingSemaphore.CurrentCount == 0)
{
if (isPriorityQueue) _priorityQueue.Enqueue(request);
else _queue.Enqueue(request);
return;
}
try
{
await _queueSemaphore.WaitAsync().ConfigureAwait(false);
if (isPriorityQueue) _priorityQueue.Enqueue(request);
else _queue.Enqueue(request);
return;
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during EnqueueUser");
}
finally
{
_queueSemaphore.Release();
}
throw new Exception("Error during EnqueueUser");
GetQueue(isPriority).Enqueue(request);
}
public void FinishRequest(Guid request)
@@ -115,10 +73,9 @@ public class RequestQueueService : IHostedService
return userQueueRequest != null && userRequest != null && userQueueRequest.ExpirationDate > DateTime.UtcNow;
}
public void RemoveFromQueue(Guid requestId, string user)
public void RemoveFromQueue(Guid requestId, string user, bool isPriority)
{
var existingRequest = _priorityQueue.FirstOrDefault(f => f.RequestId == requestId && string.Equals(f.User, user, StringComparison.Ordinal))
?? _queue.FirstOrDefault(f => f.RequestId == requestId && string.Equals(f.User, user, StringComparison.Ordinal));
var existingRequest = GetQueue(isPriority).FirstOrDefault(f => f.RequestId == requestId && string.Equals(f.User, user, StringComparison.Ordinal));
if (existingRequest == null)
{
var activeSlot = _userQueueRequests.FirstOrDefault(r => r != null && string.Equals(r.UserRequest.User, user, StringComparison.Ordinal) && r.UserRequest.RequestId == requestId);
@@ -146,14 +103,11 @@ public class RequestQueueService : IHostedService
return Task.CompletedTask;
}
public async Task<bool> StillEnqueued(Guid request, string user, MareDbContext mareDbContext)
private ConcurrentQueue<UserRequest> GetQueue(bool isPriority) => isPriority ? _priorityQueue : _queue;
public bool StillEnqueued(Guid request, string user, bool isPriority)
{
bool isPriorityQueue = await IsHighPriority(user, mareDbContext).ConfigureAwait(false);
if (isPriorityQueue)
{
return _priorityQueue.Any(c => c.RequestId == request && string.Equals(c.User, user, StringComparison.Ordinal));
}
return _queue.Any(c => c.RequestId == request && string.Equals(c.User, user, StringComparison.Ordinal));
return GetQueue(isPriority).Any(c => c.RequestId == request && string.Equals(c.User, user, StringComparison.Ordinal));
}
public Task StopAsync(CancellationToken cancellationToken)
@@ -183,11 +137,7 @@ public class RequestQueueService : IHostedService
return;
}
Parallel.For(0, _userQueueRequests.Length, new ParallelOptions()
{
MaxDegreeOfParallelism = 10,
},
async (i) =>
for (int i = 0; i < _userQueueRequests.Length; i++)
{
try
{
@@ -227,7 +177,7 @@ public class RequestQueueService : IHostedService
{
_logger.LogWarning(ex, "Error during inside queue processing");
}
});
}
}
catch (Exception ex)
{