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));
                }
            }));
        }
Пример #2
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);
        }
Пример #3
0
        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);
        }