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
|