[backend/core] Add AsyncKeyedLocker to SystemUserService

This commit is contained in:
Laura Hausmann 2024-06-21 17:01:49 +02:00
parent c49973becf
commit b23348cde9
No known key found for this signature in database
GPG key ID: D044E84C5BE01605

View file

@ -1,4 +1,5 @@
using System.Security.Cryptography;
using AsyncKeyedLock;
using Iceshrimp.Backend.Core.Database;
using Iceshrimp.Backend.Core.Database.Tables;
using Iceshrimp.Backend.Core.Helpers;
@ -9,6 +10,12 @@ namespace Iceshrimp.Backend.Core.Services;
public class SystemUserService(ILogger<SystemUserService> logger, DatabaseContext db, CacheService cache)
{
private static readonly AsyncKeyedLocker<string> KeyedLocker = new(o =>
{
o.PoolSize = 10;
o.PoolInitialFill = 2;
});
public async Task<User> GetInstanceActorAsync()
{
return await GetOrCreateSystemUserAsync("instance.actor");
@ -40,11 +47,14 @@ public class SystemUserService(ILogger<SystemUserService> logger, DatabaseContex
private async Task<User> GetOrCreateSystemUserAsync(string username)
{
return await cache.FetchAsync($"systemUser:{username}", TimeSpan.FromHours(24), async () =>
{
using (await KeyedLocker.LockAsync(username.ToLowerInvariant()))
{
logger.LogTrace("GetOrCreateSystemUser delegate method called for user {username}", username);
return await db.Users.FirstOrDefaultAsync(p => p.UsernameLower == username.ToLowerInvariant() &&
p.IsLocalUser) ??
await CreateSystemUserAsync(username);
}
});
}