diff --git a/MP.RIOC/Services/MetricsDbFlushService.cs b/MP.RIOC/Services/MetricsDbFlushService.cs
index 4d2cbd71..ac1e1ca2 100644
--- a/MP.RIOC/Services/MetricsDbFlushService.cs
+++ b/MP.RIOC/Services/MetricsDbFlushService.cs
@@ -110,21 +110,23 @@ namespace MP.RIOC.Services
foreach (var statKey in memberKeys)
{
var sKey = (RedisKey)$"{statKey}";
-#if false
- if (!TryParseKeyMetadata(sKey, out string dest, out string method, out string machId, out DateTime timestamp, out bool isHourType))
- continue;
-#endif
if (!TryParseKeyMetadata(sKey, out var meta) || meta.IsHourType) continue;
- // Se fosse scaduta e abbiamo il permesso, segnamola per la cancellazione
- if (meta.Timestamp < currentDayStart && deleteConfirmed)
+ // Verifica se la chiave è "orfana" (nessun TTL o TTL troppo lungo >30gg)
+ var keyTtl = await _db.KeyTtlAsync(sKey);
+ bool isOrphanKey = keyTtl?.TotalSeconds < 0 || keyTtl?.TotalSeconds > 30.25 * 24 * 3600;
+
+ // Se era scaduta o orfana e abbiamo il permesso, segnamola per la cancellazione
+ if ((meta.Timestamp < currentDayStart || isOrphanKey) && deleteConfirmed)
{
// 1. Segna la chiave Hash (Dati) per l'eliminazione
keysToDelete.Add(sKey);
- // 2. CORREZIONE: Devi rimuovere il riferimento dal Sorted Set (Indice)
- // Usiamo il batch per essere efficienti
- _ = batch.SortedSetRemoveAsync(indexKey, statKey);
+ // 2. Rimuovi il riferimento dal Sorted Set (Indice)
+ batch.SortedSetRemoveAsync(indexKey, statKey);
+
+ // 3. Cancellazione ricorsiva delle chiavi ausiliarie (:status, :errors, :days)
+ await DeleteAuxKeysAndIndexAsync(sKey, indexKey, batch);
}
// Recupero dati dalla Hash
@@ -137,7 +139,6 @@ namespace MP.RIOC.Services
dict.TryGetValue("totalMs", out var totalMsStr))
{
long count = long.Parse(countStr);
- count = long.Parse(countStr);
double totalMs = double.Parse(totalMsStr, CultureInfo.InvariantCulture);
double maxMs = dict.ContainsKey("maxMs") ? double.Parse(dict["maxMs"], CultureInfo.InvariantCulture) : 0;
@@ -190,7 +191,7 @@ namespace MP.RIOC.Services
int deletedCount = 0;
foreach (var key in keysToDelete)
{
- _ = batch.KeyDeleteAsync(key);
+ batch.KeyDeleteAsync(key);
deletedCount++;
}
batch.Execute();
@@ -198,6 +199,46 @@ namespace MP.RIOC.Services
}
}
+ ///