@@ -138,20 +138,18 @@ public HashSet<AssemblyLookupLocation> Restore()
138138 compilationInfoContainer.CompilationInfos.Add(("Inherited NuGet feed count", inheritedFeeds.Count.ToString()));
139139 }
140140
141- if (!CheckSpecifiedFeeds(explicitFeeds))
141+ if (!CheckSpecifiedFeeds(explicitFeeds, out var reachableFeeds ))
142142 {
143+ // If we experience a timeout, we use this fallback.
143144 // todo: we could also check the reachability of the inherited nuget feeds, but to use those in the fallback we would need to handle authentication too.
144145 var unresponsiveMissingPackageLocation = DownloadMissingPackagesFromSpecificFeeds([], explicitFeeds);
145146 return unresponsiveMissingPackageLocation is null
146147 ? []
147148 : [unresponsiveMissingPackageLocation];
148149 }
149150
150- // All explicit feeds can be considered reachable
151- HashSet<string> reachableFeeds = [];
152- reachableFeeds.UnionWith(explicitFeeds);
153151 // Inherited feeds should only be used, if they are indeed reachable (as they may be environment specific).
154- reachableFeeds.UnionWith(GetReachableNuGetFeeds(inheritedFeeds, isFallback: false, allowNonTimeoutExceptions: false ));
152+ reachableFeeds.UnionWith(GetReachableNuGetFeeds(inheritedFeeds, isFallback: false, out var _ ));
155153
156154 // If feed responsiveness is being checked, we only want to use the feeds that are reachable (note this set includes private
157155 // registry feeds if they are reachable).
@@ -234,16 +232,22 @@ public HashSet<AssemblyLookupLocation> Restore()
234232 /// </summary>
235233 /// <param name="feedsToCheck">The feeds to check.</param>
236234 /// <param name="isFallback">Whether the feeds are fallback feeds or not.</param>
237- /// <param name="allowNonTimeoutExceptions ">Whether to allow non- timeout exceptions .</param>
235+ /// <param name="isTimeout ">Whether a timeout occurred while checking the feeds .</param>
238236 /// <returns>The list of feeds that could be reached.</returns>
239- private List<string> GetReachableNuGetFeeds(HashSet<string> feedsToCheck, bool isFallback, bool allowNonTimeoutExceptions )
237+ private List<string> GetReachableNuGetFeeds(HashSet<string> feedsToCheck, bool isFallback, out bool isTimeout )
240238 {
241239 var fallbackStr = isFallback ? "fallback " : "";
242240 logger.LogInfo($"Checking {fallbackStr}NuGet feed reachability on feeds: {string.Join(", ", feedsToCheck.OrderBy(f => f))}");
243241
244242 var (initialTimeout, tryCount) = GetFeedRequestSettings(isFallback);
243+ var timeout = false;
245244 var reachableFeeds = feedsToCheck
246- .Where(feed => IsFeedReachable(feed, initialTimeout, tryCount, allowNonTimeoutExceptions))
245+ .Where(feed =>
246+ {
247+ var reachable = IsFeedReachable(feed, initialTimeout, tryCount, out var feedTimeout);
248+ timeout |= feedTimeout;
249+ return reachable;
250+ })
247251 .ToList();
248252
249253 if (reachableFeeds.Count == 0)
@@ -255,6 +259,7 @@ private List<string> GetReachableNuGetFeeds(HashSet<string> feedsToCheck, bool i
255259 logger.LogInfo($"Reachable {fallbackStr}NuGet feeds: {string.Join(", ", reachableFeeds.OrderBy(f => f))}");
256260 }
257261
262+ isTimeout = timeout;
258263 return reachableFeeds;
259264 }
260265
@@ -263,7 +268,7 @@ private bool IsDefaultFeedReachable()
263268 if (CheckNugetFeedResponsiveness)
264269 {
265270 var (initialTimeout, tryCount) = GetFeedRequestSettings(isFallback: false);
266- return IsFeedReachable(PublicNugetOrgFeed, initialTimeout, tryCount, allowNonTimeoutExceptions: false );
271+ return IsFeedReachable(PublicNugetOrgFeed, initialTimeout, tryCount, out var _ );
267272 }
268273
269274 return true;
@@ -289,7 +294,7 @@ private List<string> GetReachableFallbackNugetFeeds(HashSet<string>? feedsFromNu
289294 }
290295 }
291296
292- var reachableFallbackFeeds = GetReachableNuGetFeeds(fallbackFeeds, isFallback: true, allowNonTimeoutExceptions: false );
297+ var reachableFallbackFeeds = GetReachableNuGetFeeds(fallbackFeeds, isFallback: true, out var _ );
293298
294299 compilationInfoContainer.CompilationInfos.Add(("Reachable fallback NuGet feed count", reachableFallbackFeeds.Count.ToString()));
295300
@@ -690,7 +695,7 @@ private static async Task<HttpResponseMessage> ExecuteGetRequest(string address,
690695 return await httpClient.GetAsync(address, cancellationToken);
691696 }
692697
693- private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount, bool allowNonTimeoutExceptions )
698+ private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount, out bool isTimeout )
694699 {
695700 logger.LogInfo($"Checking if NuGet feed '{feed}' is reachable...");
696701
@@ -723,6 +728,8 @@ private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount,
723728
724729 using HttpClient client = new(httpClientHandler);
725730
731+ isTimeout = false;
732+
726733 for (var i = 0; i < tryCount; i++)
727734 {
728735 using var cts = new CancellationTokenSource();
@@ -746,16 +753,13 @@ private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount,
746753 continue;
747754 }
748755
749- // Adjust the message based on whether non-timeout exceptions are allowed.
750- var useMessage = allowNonTimeoutExceptions
751- ? "Considering the feed for use despite of the failure as it wasn't a timeout."
752- : "Not considering the feed for use.";
753- logger.LogInfo($"Querying NuGet feed '{feed}' failed. {useMessage} The reason for the failure: {exc.Message}");
754- return allowNonTimeoutExceptions;
756+ logger.LogInfo($"Querying NuGet feed '{feed}' failed. The reason for the failure: {exc.Message}");
757+ return false;
755758 }
756759 }
757760
758761 logger.LogWarning($"Didn't receive answer from NuGet feed '{feed}'. Tried it {tryCount} times.");
762+ isTimeout = true;
759763 return false;
760764 }
761765
@@ -798,10 +802,12 @@ private HashSet<string> GetExcludedFeeds()
798802 /// Checks that we can connect to the specified NuGet feeds.
799803 /// </summary>
800804 /// <param name="feeds">The set of package feeds to check.</param>
805+ /// <param name="reachableFeeds">The list of feeds that were reachable.</param>
801806 /// <returns>
802- /// True if all feeds are reachable (excluding any feeds that are configured to be excluded from the check) or false otherwise.
807+ /// True if there is no timeout when trying to reach the feeds (excluding any feeds that are configured
808+ /// to be excluded from the check) or false otherwise.
803809 /// </returns>
804- private bool CheckSpecifiedFeeds(HashSet<string> feeds)
810+ private bool CheckSpecifiedFeeds(HashSet<string> feeds, out HashSet<string> reachableFeeds )
805811 {
806812 // Exclude any feeds from the feed check that are configured by the corresponding environment variable.
807813 // These feeds are always assumed to be reachable.
@@ -817,12 +823,11 @@ private bool CheckSpecifiedFeeds(HashSet<string> feeds)
817823 return true;
818824 }).ToHashSet();
819825
820- var reachableFeeds = GetReachableNuGetFeeds(feedsToCheck, isFallback: false, allowNonTimeoutExceptions: true);
821- var allFeedsReachable = reachableFeeds.Count == feedsToCheck.Count;
822-
823- EmitUnreachableFeedsDiagnostics(allFeedsReachable);
826+ reachableFeeds = GetReachableNuGetFeeds(feedsToCheck, isFallback: false, out var isTimeout).ToHashSet();
824827
825- return allFeedsReachable;
828+ var noTimeout = !isTimeout;
829+ EmitUnreachableFeedsDiagnostics(noTimeout);
830+ return noTimeout;
826831 }
827832
828833 /// <summary>
0 commit comments