summary refs log tree commit diff
path: root/extra/admin-api/Interop
diff options
context:
space:
mode:
Diffstat (limited to 'extra/admin-api/Interop')
-rw-r--r--extra/admin-api/Interop/Spacebar.Interop.Cdn.Abstractions/LruFileCache.cs41
1 files changed, 27 insertions, 14 deletions
diff --git a/extra/admin-api/Interop/Spacebar.Interop.Cdn.Abstractions/LruFileCache.cs b/extra/admin-api/Interop/Spacebar.Interop.Cdn.Abstractions/LruFileCache.cs

index 3bd4ec09..27b55400 100644 --- a/extra/admin-api/Interop/Spacebar.Interop.Cdn.Abstractions/LruFileCache.cs +++ b/extra/admin-api/Interop/Spacebar.Interop.Cdn.Abstractions/LruFileCache.cs
@@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +using ArcaneLibs; namespace Spacebar.Interop.Cdn.Abstractions; @@ -9,21 +6,36 @@ public class LruFileCache(int maxSizeBytes) { private readonly Dictionary<string, Entry> _entries = new(); public async Task<Entry?> GetOrAdd(string key, Func<Task<Entry>> factory) { - if (_entries.TryGetValue(key, out var entry)) { - entry.LastAccessed = DateTimeOffset.UtcNow; - return entry; + lock (_entries) { + if (_entries.TryGetValue(key, out var entry)) { + entry.LastAccessed = DateTimeOffset.UtcNow; + return entry; + } } - entry = await factory(); - if (entry.Data.Length > 0 && entry.Data.Length <= maxSizeBytes) - _entries[key] = entry; + var newEntryTask = factory(); + var newEntry = await newEntryTask; + int oldSize; + lock (_entries) + oldSize = _entries.Sum(kv => kv.Value.Data.Length); + if (newEntry.Data.Length > 0 && newEntry.Data.Length <= maxSizeBytes) + lock (_entries) + _entries[key] = newEntry; - if (_entries.Sum(kv => kv.Value.Data.Length) > maxSizeBytes) { - var oldestKey = _entries.OrderBy(kv => kv.Value.LastAccessed).First().Key; - _entries.Remove(oldestKey); + lock (_entries) { + var newSize = _entries.Sum(kv => kv.Value.Data.Length); + if (newSize > maxSizeBytes) { + var oldestKey = _entries.OrderBy(kv => kv.Value.LastAccessed).First().Key; + _entries.Remove(oldestKey); + newSize = _entries.Sum(kv => kv.Value.Data.Length); + } + + var diffSize = newSize - oldSize; + Console.WriteLine( + $"LruCache: {Util.BytesToString(oldSize)} -> {Util.BytesToString(newSize)} / {Util.BytesToString(maxSizeBytes)} ({(diffSize > 0 ? "+ " : "- ") + Util.BytesToString(Math.Abs(diffSize))})"); } - return entry; + return newEntry; } public class Entry { @@ -33,3 +45,4 @@ public class LruFileCache(int maxSizeBytes) { } } +// https://cdn.old.server.spacebar.chat/emojis/1444515631118282917.webp?size=80&animated=true \ No newline at end of file