1
0
mirror of https://github.com/Radarr/Radarr.git synced 2024-11-04 10:02:40 +01:00

Prevent back-off escalation during grace period.

This commit is contained in:
Taloth Saldono 2017-06-17 23:42:04 +02:00
parent 87f3cc9014
commit 1fbe82ae47
2 changed files with 58 additions and 4 deletions

View File

@ -18,7 +18,7 @@ public void SetUp()
_epoch = DateTime.UtcNow;
}
private void WithStatus(DownloadClientStatus status)
private DownloadClientStatus WithStatus(DownloadClientStatus status)
{
Mocker.GetMock<IDownloadClientStatusRepository>()
.Setup(v => v.FindByProviderId(1))
@ -27,6 +27,8 @@ private void WithStatus(DownloadClientStatus status)
Mocker.GetMock<IDownloadClientStatusRepository>()
.Setup(v => v.All())
.Returns(new[] { status });
return status;
}
private void VerifyUpdate()
@ -77,6 +79,54 @@ public void should_consider_blocked_after_5_minutes_since_initial_failure()
status.Should().NotBeNull();
}
[Test]
public void should_not_escalate_further_till_after_5_minutes_since_initial_failure()
{
var origStatus = WithStatus(new DownloadClientStatus
{
InitialFailure = _epoch - TimeSpan.FromMinutes(4),
MostRecentFailure = _epoch - TimeSpan.FromSeconds(4),
EscalationLevel = 3
});
Subject.RecordFailure(1);
Subject.RecordFailure(1);
Subject.RecordFailure(1);
Subject.RecordFailure(1);
Subject.RecordFailure(1);
Subject.RecordFailure(1);
Subject.RecordFailure(1);
var status = Subject.GetBlockedProviders().FirstOrDefault();
status.Should().BeNull();
origStatus.EscalationLevel.Should().Be(3);
}
[Test]
public void should_escalate_further_after_5_minutes_since_initial_failure()
{
WithStatus(new DownloadClientStatus
{
InitialFailure = _epoch - TimeSpan.FromMinutes(6),
MostRecentFailure = _epoch - TimeSpan.FromSeconds(120),
EscalationLevel = 3
});
Subject.RecordFailure(1);
Subject.RecordFailure(1);
Subject.RecordFailure(1);
Subject.RecordFailure(1);
Subject.RecordFailure(1);
Subject.RecordFailure(1);
Subject.RecordFailure(1);
var status = Subject.GetBlockedProviders().FirstOrDefault();
status.Should().NotBeNull();
status.EscalationLevel.Should().BeGreaterThan(3);
}
[Test]
public void should_not_escalate_beyond_3_hours()
{

View File

@ -93,14 +93,18 @@ protected virtual void RecordFailure(int providerId, TimeSpan minimumBackOff, bo
var status = GetProviderStatus(providerId);
var now = DateTime.UtcNow;
status.MostRecentFailure = now;
if (status.EscalationLevel == 0)
{
status.InitialFailure = now;
status.EscalationLevel = 1;
escalate = false;
}
status.MostRecentFailure = now;
if (escalate)
var inGracePeriod = (status.InitialFailure.Value + MinimumTimeSinceInitialFailure) > now;
if (escalate && !inGracePeriod)
{
status.EscalationLevel = Math.Min(MaximumEscalationLevel, status.EscalationLevel + 1);
}
@ -113,7 +117,7 @@ protected virtual void RecordFailure(int providerId, TimeSpan minimumBackOff, bo
}
}
if (status.InitialFailure.Value + MinimumTimeSinceInitialFailure <= now || minimumBackOff != TimeSpan.Zero)
if (!inGracePeriod || minimumBackOff != TimeSpan.Zero)
{
status.DisabledTill = now + CalculateBackOffPeriod(status);
}