Skip to content
This repository was archived by the owner on Jul 30, 2024. It is now read-only.

Commit 82843ac

Browse files
authored
Merge pull request #613 from NuGet/dev
[ReleasePrep][2018.11.02]RI of dev into master
2 parents 0d376eb + d0e0f42 commit 82843ac

11 files changed

Lines changed: 287 additions & 7 deletions

File tree

build.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ param (
99
[string]$SemanticVersion = '1.0.0-zlocal',
1010
[string]$Branch = 'zlocal',
1111
[string]$CommitSHA,
12-
[string]$BuildBranch = '795fed66b8bae2d248237ee5ec82e688e7174a42'
12+
[string]$BuildBranch = '001c5deac1f1e2e194c1d0d5eec14183bb78e4cf'
1313
)
1414

1515
$msBuildVersion = 15;

src/NuGet.Services.Revalidate/Configuration/RevalidationQueueConfiguration.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ namespace NuGet.Services.Revalidate
77
{
88
public class RevalidationQueueConfiguration
99
{
10+
/// <summary>
11+
/// If non-null, this skips revalidations of packages with more than this many versions.
12+
/// </summary>
13+
public int? MaximumPackageVersions { get; set; }
14+
1015
/// <summary>
1116
/// The maximum times that the <see cref="RevalidationQueue"/> should look for a revalidation
1217
/// before giving up.

src/NuGet.Services.Revalidate/Services/RevalidationQueue.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,22 @@ public async Task<PackageRevalidation> NextOrNullAsync()
4545
i + 1,
4646
_config.MaximumAttempts);
4747

48-
var next = await _validationContext.PackageRevalidations
48+
// Find the next package to revalidate. We will skip packages if:
49+
// 1. The package has more than "MaximumPackageVersions" versions
50+
// 2. The package has already been enqueued for revalidation
51+
// 3. The package's revalidation was completed by an external factory (like manual admin revalidation)
52+
IQueryable<PackageRevalidation> query = _validationContext.PackageRevalidations;
53+
54+
if (_config.MaximumPackageVersions.HasValue)
55+
{
56+
query = query.Where(
57+
r =>
58+
!_validationContext.PackageRevalidations.GroupBy(r2 => r2.PackageId)
59+
.Where(g => g.Count() > _config.MaximumPackageVersions)
60+
.Any(g => g.Key == r.PackageId));
61+
}
62+
63+
var next = await query
4964
.Where(r => r.Enqueued == null)
5065
.Where(r => r.Completed == false)
5166
.OrderBy(r => r.Key)

src/NuGet.Services.Revalidate/Settings/dev.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
},
2828

2929
"Queue": {
30+
"MaximumPackageVersions": #{Jobs.nuget.services.revalidate.MaximumPackageVersions},
3031
"MaximumAttempts": 5,
3132
"SleepBetweenAttempts": "00:00:30"
3233
}

src/NuGet.Services.Revalidate/Settings/int.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
},
2828

2929
"Queue": {
30+
"MaximumPackageVersions": #{Jobs.nuget.services.revalidate.MaximumPackageVersions},
3031
"MaximumAttempts": 5,
3132
"SleepBetweenAttempts": "00:00:30"
3233
}

src/NuGet.Services.Revalidate/Settings/prod.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
},
2828

2929
"Queue": {
30+
"MaximumPackageVersions": #{Jobs.nuget.services.revalidate.MaximumPackageVersions},
3031
"MaximumAttempts": 5,
3132
"SleepBetweenAttempts": "00:00:30"
3233
}

src/NuGet.Services.Validation.Orchestrator/Services/SymbolEntityService.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
5+
using System.Data.Entity;
56
using System.Linq;
67
using System.Threading.Tasks;
78
using NuGetGallery;
@@ -42,7 +43,9 @@ public IValidatingEntity<SymbolPackage> FindPackageByKey(int key)
4243
{
4344
var symbolPackage = _symbolsPackageRepository
4445
.GetAll()
45-
.SingleOrDefault(p => p.Key == key);
46+
.Include(sp => sp.Package)
47+
.Include(sp => sp.Package.PackageRegistration)
48+
.SingleOrDefault(sp => sp.Key == key);
4649
return symbolPackage == null ? null : new SymbolPackageValidatingEntity(symbolPackage);
4750
}
4851

src/NuGet.Services.Validation.Orchestrator/Services/SymbolsMessageService.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ public async Task SendPublishedMessageAsync(SymbolPackage symbolPackage)
4343
packageSupportUrl,
4444
_serviceConfiguration.EmailConfiguration.EmailSettingsUrl,
4545
Array.Empty<string>());
46+
47+
_logger.LogInformation("The publish email will be sent for the symbol {SymbolId} {SymbolVersion}",
48+
symbolPackage.Id,
49+
symbolPackage.Version);
4650
await _messageService.SendMessageAsync(symbolPackageAddedMessage);
4751
}
4852

@@ -66,6 +70,10 @@ public async Task SendValidationFailedMessageAsync(SymbolPackage symbolPackage,
6670
_serviceConfiguration.EmailConfiguration.AnnouncementsUrl,
6771
_serviceConfiguration.EmailConfiguration.TwitterUrl);
6872

73+
_logger.LogInformation("The validation failed email will be sent for the symbol {SymbolId} {SymbolVersion} and ValidationSetKey {ValidationSetKey}",
74+
symbolPackage.Id,
75+
symbolPackage.Version,
76+
validationSet.Key);
6977
await _messageService.SendMessageAsync(symbolPackageValidationFailedMessage);
7078
}
7179

@@ -80,6 +88,9 @@ public async Task SendValidationTakingTooLongMessageAsync(SymbolPackage symbolPa
8088
symbolPackage,
8189
_serviceConfiguration.GalleryPackageUrl(symbolPackage.Package.PackageRegistration.Id, symbolPackage.Package.NormalizedVersion));
8290

91+
_logger.LogInformation("The validation failed email will be sent for the symbol {SymbolId} {SymbolVersion}.",
92+
symbolPackage.Id,
93+
symbolPackage.Version);
8394
await _messageService.SendMessageAsync(symbolPackageValidationTakingTooLongMessage);
8495
}
8596
}

src/Validation.Common.Job/Storage/ValidatorStateService.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ public async Task<ValidatorStatus> TryAddValidatorStatusAsync(IValidationRequest
142142
_logger.LogWarning(
143143
Error.ValidatorStateServiceFailedToAddStatus,
144144
"Failed to add validation status for {ValidationId} ({PackageId} {PackageVersion}) as a record already exists",
145+
request.ValidationId,
145146
request.PackageId,
146147
request.PackageVersion);
147148

@@ -169,6 +170,7 @@ public async Task<ValidatorStatus> TryUpdateValidationStatusAsync(IValidationReq
169170
_logger.LogWarning(
170171
Error.ValidatorStateServiceFailedToUpdateStatus,
171172
"Failed to save validation status for {ValidationId} ({PackageId} {PackageVersion}) as the current status is stale",
173+
request.ValidationId,
172174
request.PackageId,
173175
request.PackageVersion);
174176

tests/NuGet.Services.Revalidate.Tests/Services/RevalidationQueueFacts.cs

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
5+
using System.Collections.Generic;
56
using System.Threading.Tasks;
67
using Microsoft.Extensions.Logging;
78
using Moq;
@@ -132,6 +133,121 @@ public async Task SkipsRepositorySignedPackages()
132133
_telemetryService.Verify(t => t.TrackPackageRevalidationMarkedAsCompleted("Repository.Signed.Package", "1.0.0"), Times.Once);
133134
}
134135

136+
[Theory]
137+
[MemberData(nameof(SkipsPackagesWithTooManyVersionsData))]
138+
public async Task SkipsPackagesWithTooManyVersions(int? maximumPackageVersions, bool skipsPackageWithManyVersions)
139+
{
140+
_config.MaximumPackageVersions = maximumPackageVersions;
141+
142+
// Arrange
143+
_validationContext.Mock(packageRevalidations: new[]
144+
{
145+
new PackageRevalidation
146+
{
147+
Key = 1,
148+
PackageId = "Package.With.Many.Versions",
149+
PackageNormalizedVersion = "1.0.0",
150+
Enqueued = null,
151+
Completed = false,
152+
},
153+
new PackageRevalidation
154+
{
155+
Key = 2,
156+
PackageId = "Package.With.Many.Versions",
157+
PackageNormalizedVersion = "2.0.0",
158+
Enqueued = null,
159+
Completed = false,
160+
},
161+
new PackageRevalidation
162+
{
163+
Key = 3,
164+
PackageId = "Package.With.Many.Versions",
165+
PackageNormalizedVersion = "3.0.0",
166+
Enqueued = null,
167+
Completed = false,
168+
},
169+
new PackageRevalidation
170+
{
171+
Key = 4,
172+
PackageId = "Package",
173+
PackageNormalizedVersion = "1.0.0",
174+
Enqueued = null,
175+
Completed = false,
176+
},
177+
});
178+
179+
_galleryContext.Mock(packages: new[]
180+
{
181+
new Package
182+
{
183+
PackageRegistration = new PackageRegistration { Id = "Package.With.Many.Versions" },
184+
NormalizedVersion = "1.0.0",
185+
PackageStatusKey = PackageStatus.Available,
186+
},
187+
new Package
188+
{
189+
PackageRegistration = new PackageRegistration { Id = "Package.With.Many.Versions" },
190+
NormalizedVersion = "2.0.0",
191+
PackageStatusKey = PackageStatus.Available,
192+
},
193+
new Package
194+
{
195+
PackageRegistration = new PackageRegistration { Id = "Package.With.Many.Versions" },
196+
NormalizedVersion = "3.0.0",
197+
PackageStatusKey = PackageStatus.Available,
198+
},
199+
new Package
200+
{
201+
PackageRegistration = new PackageRegistration { Id = "Package" },
202+
NormalizedVersion = "1.0.0",
203+
PackageStatusKey = PackageStatus.Available,
204+
},
205+
});
206+
207+
// Act
208+
var next = await _target.NextOrNullAsync();
209+
210+
// Assert
211+
if (skipsPackageWithManyVersions)
212+
{
213+
Assert.Equal("Package", next.PackageId);
214+
Assert.Equal("1.0.0", next.PackageNormalizedVersion);
215+
216+
_telemetryService.Verify(t => t.TrackPackageRevalidationMarkedAsCompleted("Package.With.Many.Versions", "1.0.0"), Times.Never);
217+
_telemetryService.Verify(t => t.TrackPackageRevalidationMarkedAsCompleted("Package.With.Many.Versions", "2.0.0"), Times.Never);
218+
_telemetryService.Verify(t => t.TrackPackageRevalidationMarkedAsCompleted("Package.With.Many.Versions", "3.0.0"), Times.Never);
219+
}
220+
else
221+
{
222+
Assert.Equal("Package.With.Many.Versions", next.PackageId);
223+
Assert.Equal("1.0.0", next.PackageNormalizedVersion);
224+
}
225+
}
226+
227+
public static IEnumerable<object[]> SkipsPackagesWithTooManyVersionsData()
228+
{
229+
// If the "MaximumPackageVersions" is null, no packages should be skipped for having too many versions.
230+
yield return new object[]
231+
{
232+
null,
233+
false
234+
};
235+
236+
// If "MaximumPackageVersions" is set, packages with less versions than the value should not be skipped.
237+
yield return new object[]
238+
{
239+
100,
240+
false
241+
};
242+
243+
// If "MaximumPackageVersions" is set, packages with more versions than the value should be skipped.
244+
yield return new object[]
245+
{
246+
2,
247+
true
248+
};
249+
}
250+
135251
[Fact]
136252
public async Task SkipsDeletedPackages()
137253
{

0 commit comments

Comments
 (0)