15 lines
728 B
C#
15 lines
728 B
C#
namespace QVPN.Core;
|
|
|
|
public sealed class RecoveryPolicy
|
|
{
|
|
public int ConsecutiveFailures { get; private set; }
|
|
public int Attempts { get; private set; }
|
|
public DateTimeOffset NextAttempt { get; private set; }
|
|
public bool HealthFailed() => ++ConsecutiveFailures >= 3;
|
|
public void Healthy() { ConsecutiveFailures = 0; }
|
|
public void Stable() { Healthy(); Attempts = 0; }
|
|
public void Failed(DateTimeOffset now) { ConsecutiveFailures = 0; Attempts = Math.Min(Attempts + 1, 10); NextAttempt = now.AddSeconds(Math.Min(60, 2 * Math.Pow(2, Attempts - 1))); }
|
|
public void Reset() { Stable(); NextAttempt = DateTimeOffset.MinValue; }
|
|
public bool CanAttempt(DateTimeOffset now) => now >= NextAttempt;
|
|
}
|