1
1
using Microsoft . Extensions . Options ;
2
2
using NTorSpectator . Observer . TorIntegration ;
3
3
using NTorSpectator . Services ;
4
+ using NTorSpectator . Services . Models ;
4
5
5
6
namespace NTorSpectator . Observer . Services ;
6
7
@@ -45,20 +46,31 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
45
46
private async Task Watch ( )
46
47
{
47
48
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 ) )
49
52
{
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
51
55
{
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 )
59
58
{
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
+ }
61
67
}
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" ) ;
62
74
}
63
75
}
64
76
}
@@ -78,6 +90,8 @@ private async Task<TorWatchResults> ObserveSite(string site)
78
90
var negative = torReply . Count ( x => x . Action == HsDescAction . Failed ) ;
79
91
return new ( site , positive , negative ) ;
80
92
}
93
+
94
+ private record QueuedSite ( Site Site , int ObservationsCount ) ;
81
95
}
82
96
83
97
public record TorWatchResults ( string Site , int Positive , int Negative )
0 commit comments