wabbajack/Wabbajack.Server/Services/MetricsKeyCache.cs

61 lines
1.4 KiB
C#
Raw Normal View History

2021-02-18 05:44:54 +00:00
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Wabbajack.Common;
using Wabbajack.Server.DataLayer;
2021-10-23 16:51:17 +00:00
namespace Wabbajack.Server.Services;
public class MetricsKeyCache : IStartable
2021-02-18 05:44:54 +00:00
{
2021-10-23 16:51:17 +00:00
private HashSet<string> _knownKeys = new();
private readonly AsyncLock _lock = new();
private ILogger<MetricsKeyCache> _logger;
private readonly SqlService _sql;
public MetricsKeyCache(ILogger<MetricsKeyCache> logger, SqlService sql)
2021-02-18 05:44:54 +00:00
{
2021-10-23 16:51:17 +00:00
_logger = logger;
_sql = sql;
}
2021-02-18 05:44:54 +00:00
2021-10-23 16:51:17 +00:00
public async Task Start()
{
_knownKeys = _sql.AllKeys().Result.ToHashSet();
}
2021-02-18 05:44:54 +00:00
2021-10-23 16:51:17 +00:00
public async Task<bool> IsValidKey(string key)
{
using (var _ = await _lock.WaitAsync())
2021-02-18 05:44:54 +00:00
{
2021-10-23 16:51:17 +00:00
if (_knownKeys.Contains(key)) return true;
2021-02-18 05:44:54 +00:00
}
2021-10-23 16:51:17 +00:00
if (await _sql.ValidMetricsKey(key))
2021-02-18 05:44:54 +00:00
{
2021-10-23 16:51:17 +00:00
using var _ = await _lock.WaitAsync();
_knownKeys.Add(key);
return true;
2021-02-18 05:44:54 +00:00
}
2021-10-23 16:51:17 +00:00
return false;
}
2021-02-18 05:44:54 +00:00
2021-10-23 16:51:17 +00:00
public async Task AddKey(string key)
{
using (var _ = await _lock.WaitAsync())
2021-02-18 05:44:54 +00:00
{
2021-10-23 16:51:17 +00:00
if (_knownKeys.Contains(key)) return;
_knownKeys.Add(key);
2021-02-18 05:44:54 +00:00
}
2021-10-23 16:51:17 +00:00
await _sql.AddMetricsKey(key);
}
public async Task<long> KeyCount()
{
using var _ = await _lock.WaitAsync();
return _knownKeys.Count;
2021-02-18 05:44:54 +00:00
}
2021-10-23 16:51:17 +00:00
}