jetherald/JetHerald/LeakyBucket.cs
Basique Evangelist db78d4a3c7 Timeouts
(cherry picked from commit 52ae87ca911fb7f5794e64ab7213c5b791ce085d)
2021-10-16 19:59:34 +03:00

39 lines
1.1 KiB
C#

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using Microsoft.Extensions.Options;
namespace JetHerald
{
public class LeakyBucket
{
private readonly ConcurrentDictionary<uint, DateTime> expiryDates = new();
private readonly Options.Timeout config;
public LeakyBucket(IOptions<Options.Timeout> cfgOptions)
{
config = cfgOptions.Value;
}
public bool IsTimedOut(uint key)
{
var debtLimit = DateTime.Now.AddSeconds(config.DebtLimitSeconds);
var time = expiryDates.GetValueOrDefault(key, DateTime.Now);
Console.WriteLine(time);
return time > debtLimit;
}
public void ApplyCost(uint key, int cost)
{
expiryDates.AddOrUpdate(key,
key => DateTime.Now.AddSeconds(cost),
(key, oldDebt) =>
{
if (oldDebt < DateTime.Now)
return DateTime.Now.AddSeconds(cost);
return oldDebt.AddSeconds(cost);
});
}
}
}