protected override async Task RunInternalAsync(CancellationToken cancellationToken) { var currentMessageCount = await _queue.GetMessageCount(cancellationToken); if (currentMessageCount > _maxRequeueQueueSize) { Logger.LogInformation( "Can't requeue any invalid packages because the queue has too many messages ({CurrentMessageCount} > {MaxRequeueQueueSize})!", currentMessageCount, _maxRequeueQueueSize); return; } var invalidPackages = await _statusService.GetAsync(PackageState.Invalid, cancellationToken); await Task.WhenAll(invalidPackages.Select(invalidPackage => { try { Logger.LogInformation("Requeuing invalid package {PackageId} {PackageVersion}.", invalidPackage.Package.Id, invalidPackage.Package.Version); return(_queue.AddAsync( new PackageValidatorContext(invalidPackage), cancellationToken)); } catch (Exception e) { Logger.LogError("Failed to requeue invalid package {PackageId} {PackageVersion}: {Exception}", invalidPackage.Package.Id, invalidPackage.Package.Version, e); return(Task.FromResult(0)); } })); }
private async Task RunPackageValidatorAsync( PackageValidatorContext queuedContext, CancellationToken token) { var feedPackage = queuedContext.Package; Logger.LogInformation("Running PackageValidator on PackageValidatorContext for {PackageId} {PackageVersion}.", feedPackage.Id, feedPackage.Version); var catalogEntries = queuedContext.CatalogEntries; var existingStatus = await _statusService.GetAsync(feedPackage, token); if (catalogEntries != null && existingStatus?.ValidationResult?.CatalogEntries != null && CompareCatalogEntries(catalogEntries, existingStatus.ValidationResult.CatalogEntries)) { // A newer catalog entry of this package has already been validated. Logger.LogInformation("A newer catalog entry of {PackageId} {PackageVersion} has already been processed ({OldCommitTimeStamp} < {NewCommitTimeStamp}).", feedPackage.Id, feedPackage.Version, catalogEntries.Max(c => c.CommitTimeStamp), existingStatus.ValidationResult.CatalogEntries.Max(c => c.CommitTimeStamp)); return; } var context = new PackageValidatorContext(feedPackage, catalogEntries); var result = await _packageValidator.ValidateAsync(context, _client, token); await _notificationService.OnPackageValidationFinishedAsync(result, token); var status = new PackageMonitoringStatus(result); PackageMonitoringStatusAccessConditionHelper.UpdateFromExisting(status, existingStatus); await _statusService.UpdateAsync(status, token); }
private async Task <bool> IsStatusOutdatedAsync( PackageStatusOutdatedCheck check, CancellationToken cancellationToken) { var status = await _statusService.GetAsync(check.Identity, cancellationToken); var catalogEntries = status?.ValidationResult?.CatalogEntries; if (catalogEntries == null || !catalogEntries.Any()) { return(true); } var latestCatalogEntryTimestampMetadata = await PackageTimestampMetadata.FromCatalogEntries(_client, catalogEntries); return(check.Timestamp > latestCatalogEntryTimestampMetadata.Last); }
private async Task RunPackageValidatorAsync( PackageValidatorContext queuedContext, CancellationToken token) { var feedPackage = queuedContext.Package; Logger.LogInformation("Running PackageValidator on PackageValidatorContext for {PackageId} {PackageVersion}.", feedPackage.Id, feedPackage.Version); IEnumerable <CatalogIndexEntry> catalogEntries = null; if (queuedContext.CatalogEntries != null) { catalogEntries = queuedContext.CatalogEntries; } else { Logger.LogInformation("PackageValidatorContext for {PackageId} {PackageVersion} is missing catalog entries! " + "Attempting to fetch most recent catalog entry from registration.", feedPackage.Id, feedPackage.Version); catalogEntries = await FetchCatalogIndexEntriesFromRegistrationAsync(feedPackage, token); } var existingStatus = await _statusService.GetAsync(feedPackage, token); if (existingStatus?.ValidationResult != null && CompareCatalogEntries(catalogEntries, existingStatus.ValidationResult.CatalogEntries)) { // A newer catalog entry of this package has already been validated. Logger.LogInformation("A newer catalog entry of {PackageId} {PackageVersion} has already been processed ({OldCommitTimeStamp} < {NewCommitTimeStamp}).", feedPackage.Id, feedPackage.Version, catalogEntries.Max(c => c.CommitTimeStamp), existingStatus.ValidationResult.CatalogEntries.Max(c => c.CommitTimeStamp)); return; } var context = new PackageValidatorContext(feedPackage, catalogEntries); var result = await _packageValidator.ValidateAsync(context, _client, token); await _notificationService.OnPackageValidationFinishedAsync(result, token); var status = new PackageMonitoringStatus(result); await _statusService.UpdateAsync(status, token); }