perf: use stable sha256 cache keys for summarizer requests
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using JobTrackerApi.Controllers;
|
using JobTrackerApi.Controllers;
|
||||||
|
using JobTrackerApi.Services;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace JobTrackerApi.Tests;
|
namespace JobTrackerApi.Tests;
|
||||||
@@ -20,4 +21,12 @@ public sealed class AttachmentsControllerTests
|
|||||||
Assert.Contains(".png", values);
|
Assert.Contains(".png", values);
|
||||||
Assert.DoesNotContain(".exe", values);
|
Assert.DoesNotContain(".exe", values);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Max_file_size_limit_is_10_mb()
|
||||||
|
{
|
||||||
|
var field = typeof(AttachmentsController).GetField("MaxFileSizeBytes", BindingFlags.NonPublic | BindingFlags.Static);
|
||||||
|
Assert.NotNull(field);
|
||||||
|
Assert.Equal(10 * 1024 * 1024, (long)field!.GetValue(null)!);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using JobTrackerApi.Controllers;
|
using JobTrackerApi.Controllers;
|
||||||
|
using JobTrackerApi.Services;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace JobTrackerApi.Tests;
|
namespace JobTrackerApi.Tests;
|
||||||
@@ -19,4 +20,19 @@ public sealed class OwnershipGuardTests
|
|||||||
var method = typeof(CorrespondenceController).GetMethod("FindOwnedMessageAsync", BindingFlags.NonPublic | BindingFlags.Instance);
|
var method = typeof(CorrespondenceController).GetMethod("FindOwnedMessageAsync", BindingFlags.NonPublic | BindingFlags.Instance);
|
||||||
Assert.NotNull(method);
|
Assert.NotNull(method);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Summarizer_service_uses_sha256_cache_key_builder()
|
||||||
|
{
|
||||||
|
var method = typeof(SummarizerService).GetMethod("BuildCacheKey", BindingFlags.NonPublic | BindingFlags.Static);
|
||||||
|
Assert.NotNull(method);
|
||||||
|
|
||||||
|
var first = (string)method!.Invoke(null, new object[] { "example text", 150, 30 })!;
|
||||||
|
var second = (string)method.Invoke(null, new object[] { "example text", 150, 30 })!;
|
||||||
|
var different = (string)method.Invoke(null, new object[] { "different text", 150, 30 })!;
|
||||||
|
|
||||||
|
Assert.Equal(first, second);
|
||||||
|
Assert.StartsWith("summ:", first);
|
||||||
|
Assert.NotEqual(first, different);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
@@ -63,11 +64,20 @@ namespace JobTrackerApi.Services
|
|||||||
_cache = cache;
|
_cache = cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static string BuildCacheKey(string text, int maxLength, int minLength)
|
||||||
|
{
|
||||||
|
var payload = $"{text}\n::{maxLength}:{minLength}";
|
||||||
|
var hash = Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes(payload))).ToLowerInvariant();
|
||||||
|
return $"summ:{hash}";
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<string?> SummarizeAsync(string text, int maxLength = 150, int minLength = 30)
|
public async Task<string?> SummarizeAsync(string text, int maxLength = 150, int minLength = 30)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(text)) return null;
|
if (string.IsNullOrWhiteSpace(text)) return null;
|
||||||
|
|
||||||
var key = $"summ:{text.GetHashCode()}:{maxLength}:{minLength}";
|
// Use a deterministic content hash instead of string.GetHashCode() so cache keys
|
||||||
|
// are collision-resistant and stable across process restarts.
|
||||||
|
var key = BuildCacheKey(text, maxLength, minLength);
|
||||||
Interlocked.Increment(ref _requests);
|
Interlocked.Increment(ref _requests);
|
||||||
|
|
||||||
if (_cache.TryGetValue<string>(key, out var cached))
|
if (_cache.TryGetValue<string>(key, out var cached))
|
||||||
|
|||||||
Reference in New Issue
Block a user