Skip to content

Commit 011ad78

Browse files
authored
Merge pull request #14 from zetroot/feature/retry-on-failure
Added a retry queue for failed sites #12 +semver: feature
2 parents 28027d8 + 7aa2221 commit 011ad78

File tree

1 file changed

+24
-10
lines changed

1 file changed

+24
-10
lines changed

src/NTorSpectator.Observer/Services/Spectator.cs

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.Extensions.Options;
22
using NTorSpectator.Observer.TorIntegration;
33
using NTorSpectator.Services;
4+
using NTorSpectator.Services.Models;
45

56
namespace NTorSpectator.Observer.Services;
67

@@ -45,20 +46,31 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
4546
private async Task Watch()
4647
{
4748
var sites = await _sitesCatalogue.GetAllSites();
48-
foreach (var site in sites)
49+
var siteQueue = new Queue<QueuedSite>(sites.Select(x => new QueuedSite(x, 0)));
50+
51+
while(siteQueue.TryDequeue(out var queuedSite))
4952
{
50-
using (_logger.BeginScope(new Dictionary<string, object> { { "HiddenService", site.SiteUri } }))
53+
using var _ = _logger.BeginScope(new Dictionary<string, object> { { "HiddenService", queuedSite.Site.SiteUri } });
54+
try
5155
{
52-
try
53-
{
54-
var observations = await ObserveSite(site.SiteUri);
55-
await _siteObserver.AddNewObservation(site.SiteUri, observations.IsOk);
56-
_logger.LogInformation("Site observed");
57-
}
58-
catch (Exception e)
56+
var observations = await ObserveSite(queuedSite.Site.SiteUri);
57+
if (!observations.IsOk)
5958
{
60-
_logger.LogError(e, "Observation for site failed");
59+
_logger.LogDebug("Site observed as not available");
60+
var siteObservationsCount = queuedSite.ObservationsCount;
61+
if (siteObservationsCount < 3)
62+
{
63+
_logger.LogDebug("Site has been observed {Count} times, returning it to queue", siteObservationsCount);
64+
siteQueue.Enqueue(queuedSite with{ObservationsCount = siteObservationsCount + 1});
65+
continue;
66+
}
6167
}
68+
await _siteObserver.AddNewObservation(queuedSite.Site.SiteUri, observations.IsOk);
69+
_logger.LogInformation("Site observed");
70+
}
71+
catch (Exception e)
72+
{
73+
_logger.LogError(e, "Observation for site failed");
6274
}
6375
}
6476
}
@@ -78,6 +90,8 @@ private async Task<TorWatchResults> ObserveSite(string site)
7890
var negative = torReply.Count(x => x.Action == HsDescAction.Failed);
7991
return new(site, positive, negative);
8092
}
93+
94+
private record QueuedSite(Site Site, int ObservationsCount);
8195
}
8296

8397
public record TorWatchResults(string Site, int Positive, int Negative)

0 commit comments

Comments
 (0)