Skip to content

Commit d039913

Browse files
Apiview revision upgradability to new parser version test (#8882)
* Verify revision upgradability as a dry run task
1 parent b6d0b88 commit d039913

5 files changed

Lines changed: 63 additions & 20 deletions

File tree

src/dotnet/APIView/APIViewWeb/HostedServices/ReviewBackgroundHostedService.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ public class ReviewBackgroundHostedService : BackgroundService
2121
private readonly HashSet<string> _upgradeDisabledLangs = new HashSet<string>();
2222
private readonly int _backgroundBatchProcessCount;
2323
private readonly TelemetryClient _telemetryClient;
24+
private readonly bool _isUpgradeTestEnabled;
25+
private readonly string _packageNameFilterForUpgrade;
2426

2527
public ReviewBackgroundHostedService(
2628
IReviewManager reviewManager, IAPIRevisionsManager apiRevisionManager,
@@ -36,6 +38,17 @@ public ReviewBackgroundHostedService(
3638
_isDisabled = taskDisabled;
3739
}
3840

41+
if (bool.TryParse(configuration["ReviewUpgradabilityTestEnabled"], out bool upgradeTestEnabled))
42+
{
43+
_isUpgradeTestEnabled = upgradeTestEnabled;
44+
}
45+
46+
var packageNameFilterForUpgrade = configuration["PackageNameFilterForReviewUpgrade"];
47+
if (!string.IsNullOrEmpty(packageNameFilterForUpgrade))
48+
{
49+
_packageNameFilterForUpgrade = packageNameFilterForUpgrade;
50+
}
51+
3952
var gracePeriod = configuration["ArchiveReviewGracePeriodInMonths"];
4053
if (String.IsNullOrEmpty(gracePeriod) || !int.TryParse(gracePeriod, out _autoArchiveInactiveGracePeriodMonths))
4154
{
@@ -61,7 +74,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
6174
{
6275
try
6376
{
64-
await _reviewManager.UpdateReviewsInBackground(_upgradeDisabledLangs, _backgroundBatchProcessCount);
77+
await _reviewManager.UpdateReviewsInBackground(_upgradeDisabledLangs, _backgroundBatchProcessCount, _isUpgradeTestEnabled, _packageNameFilterForUpgrade);
6578
await ArchiveInactiveAPIReviews(stoppingToken, _autoArchiveInactiveGracePeriodMonths);
6679
}
6780
catch (Exception ex)

src/dotnet/APIView/APIViewWeb/Managers/APIRevisionsManager.cs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -711,8 +711,9 @@ public async Task<bool> AreAPIRevisionsTheSame(APIRevisionListItemModel revision
711711
/// </summary>
712712
/// <param name="revision"></param>
713713
/// <param name="languageService"></param>
714+
/// <param name="verifyUpgradabilityOnly"> </param>
714715
/// <returns></returns>
715-
public async Task UpdateAPIRevisionAsync(APIRevisionListItemModel revision, LanguageService languageService)
716+
public async Task UpdateAPIRevisionAsync(APIRevisionListItemModel revision, LanguageService languageService, bool verifyUpgradabilityOnly)
716717
{
717718
foreach (var file in revision.Files)
718719
{
@@ -728,20 +729,31 @@ public async Task UpdateAPIRevisionAsync(APIRevisionListItemModel revision, Lang
728729
// This is causing issue when updating review using latest parser since it expects Name field as file name
729730
// We have added a new property FileName which is only set for new reviews
730731
// All older reviews needs to be handled by checking review name field
731-
var fileName = file.FileName ?? file.Name;
732+
var fileName = file.FileName ?? file.FileId;
732733
var codeFile = await languageService.GetCodeFileAsync(fileName, fileOriginal, false);
733-
await _codeFileRepository.UpsertCodeFileAsync(revision.Id, file.FileId, codeFile);
734-
// update only version string
735-
file.VersionString = codeFile.VersionString;
736-
if (codeFile.ReviewLines.Count > 0) {
737-
file.ParserStyle = ParserStyle.Tree;
734+
if (!verifyUpgradabilityOnly)
735+
{
736+
await _codeFileRepository.UpsertCodeFileAsync(revision.Id, file.FileId, codeFile);
737+
// update only version string
738+
file.VersionString = codeFile.VersionString;
739+
if (codeFile.ReviewLines.Count > 0)
740+
{
741+
file.ParserStyle = ParserStyle.Tree;
742+
}
743+
await _apiRevisionsRepository.UpsertAPIRevisionAsync(revision);
744+
_telemetryClient.TrackTrace($"Successfully Updated {revision.Language} revision with id {revision.Id}");
745+
}
746+
else
747+
{
748+
_telemetryClient.TrackTrace($"Revision with id {revision.Id} for package {codeFile.PackageName} can be upgraded using new parser version.");
738749
}
739-
await _apiRevisionsRepository.UpsertAPIRevisionAsync(revision);
740-
_telemetryClient.TrackTrace($"Successfully Updated {revision.Language} revision with id {revision.Id}");
741750
}
742751
catch (Exception ex)
743752
{
744-
_telemetryClient.TrackTrace($"Failed to update {revision.Language} revision with id {revision.Id}");
753+
if (!verifyUpgradabilityOnly)
754+
_telemetryClient.TrackTrace($"Failed to update {revision.Language} revision with id {revision.Id}");
755+
else
756+
_telemetryClient.TrackTrace($"Revision with id {revision.Id} for package {file.PackageName} cannot be upgraded using new parser version.");
745757
_telemetryClient.TrackException(ex);
746758
}
747759
}

src/dotnet/APIView/APIViewWeb/Managers/Interfaces/IAPIRevisionsManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public APIRevisionListItemModel GetNewAPIRevisionAsync(APIRevisionType apiRevisi
3838
public TreeNode<InlineDiffLine<CodeLine>> ComputeSectionDiff(TreeNode<CodeLine> before, TreeNode<CodeLine> after, RenderedCodeFile beforeFile, RenderedCodeFile afterFile);
3939
public Task<APIRevisionListItemModel> CreateAPIRevisionAsync(string userName, string reviewId, APIRevisionType apiRevisionType, string label,
4040
MemoryStream memoryStream, CodeFile codeFile, string originalName = null, int? prNumber = null);
41-
public Task UpdateAPIRevisionAsync(APIRevisionListItemModel revision, LanguageService languageService);
41+
public Task UpdateAPIRevisionAsync(APIRevisionListItemModel revision, LanguageService languageService, bool verifyUpgradabilityOnly);
4242
public Task UpdateAPIRevisionAsync(APIRevisionListItemModel revision);
4343
public Task AutoArchiveAPIRevisions(int archiveAfterMonths);
4444
public Task AssignReviewersToAPIRevisionAsync(ClaimsPrincipal User, string apiRevisionId, HashSet<string> reviewers);

src/dotnet/APIView/APIViewWeb/Managers/Interfaces/IReviewManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ public interface IReviewManager
2525
public Task<ReviewListItemModel> ToggleReviewApprovalAsync(ClaimsPrincipal user, string id, string revisionId, string notes="");
2626
public Task ApproveReviewAsync(ClaimsPrincipal user, string reviewId, string notes = "");
2727
public Task<int> GenerateAIReview(string reviewId, string revisionId);
28-
public Task UpdateReviewsInBackground(HashSet<string> updateDisabledLanguages, int backgroundBatchProcessCount);
28+
public Task UpdateReviewsInBackground(HashSet<string> updateDisabledLanguages, int backgroundBatchProcessCount, bool verifyUpgradabilityOnly, string packageNameFilterForUpgrade);
2929
}
3030
}

src/dotnet/APIView/APIViewWeb/Managers/ReviewManager.cs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -397,14 +397,24 @@ public async Task<int> GenerateAIReview(string reviewId, string revisionId)
397397
/// </summary>
398398
/// <param name="updateDisabledLanguages"></param>
399399
/// <param name="backgroundBatchProcessCount"></param>
400+
/// <param name="verifyUpgradabilityOnly"></param>
401+
/// <param name="packageNameFilterForUpgrade"></param>
400402
/// <returns></returns>
401-
public async Task UpdateReviewsInBackground(HashSet<string> updateDisabledLanguages, int backgroundBatchProcessCount)
403+
public async Task UpdateReviewsInBackground(HashSet<string> updateDisabledLanguages, int backgroundBatchProcessCount, bool verifyUpgradabilityOnly, string packageNameFilterForUpgrade = "")
402404
{
405+
// verifyUpgradabilityOnly is set when we need to run the upgrade in read only mode to recreate code files
406+
// But review code file or metadata in the DB will not be updated
407+
// This flag is set only to make sure revisions are upgradable to the latest version of the parser
408+
if(verifyUpgradabilityOnly)
409+
{
410+
_telemetryClient.TrackTrace("Running background task to verify review upgradability only.");
411+
}
412+
403413
foreach (var language in LanguageService.SupportedLanguages)
404414
{
405415
if (updateDisabledLanguages.Contains(language))
406416
{
407-
_telemetryClient.TrackTrace("Background task to update API review at startup is disabled for langauge " + language);
417+
_telemetryClient.TrackTrace("Background task to update API review at startup is disabled for language " + language);
408418
continue;
409419
}
410420
var languageService = LanguageServiceHelpers.GetLanguageService(language, _languageServices);
@@ -414,16 +424,24 @@ public async Task UpdateReviewsInBackground(HashSet<string> updateDisabledLangua
414424
// If review is updated using devops pipeline then batch process update review requests
415425
if (languageService.IsReviewGenByPipeline)
416426
{
417-
await UpdateReviewsUsingPipeline(language, languageService, backgroundBatchProcessCount);
427+
_telemetryClient.TrackTrace($"{language} uses sandboxing pipeline to upgrade API revisions. Upgrade eligibility test is not yet supported for {language}.");
428+
// Do not run sandboxing based upgrade during verify upgradability only mode
429+
// This requires some changes in the pipeline to support this mode
430+
if (!verifyUpgradabilityOnly)
431+
{
432+
await UpdateReviewsUsingPipeline(language, languageService, backgroundBatchProcessCount);
433+
}
418434
}
419435
else
420436
{
421437
var reviews = await _reviewsRepository.GetReviewsAsync(language: language, isClosed: false);
422-
438+
if (!string.IsNullOrEmpty(packageNameFilterForUpgrade))
439+
{
440+
reviews = reviews.Where(r => r.PackageName == packageNameFilterForUpgrade);
441+
}
423442
foreach (var review in reviews)
424443
{
425444
var revisions = await _apiRevisionsManager.GetAPIRevisionsAsync(review.Id);
426-
427445
foreach (var revision in revisions)
428446
{
429447
if (
@@ -434,8 +452,8 @@ public async Task UpdateReviewsInBackground(HashSet<string> updateDisabledLangua
434452
var operation = _telemetryClient.StartOperation(requestTelemetry);
435453
try
436454
{
437-
await Task.Delay(500);
438-
await _apiRevisionsManager.UpdateAPIRevisionAsync(revision, languageService);
455+
await Task.Delay(100);
456+
await _apiRevisionsManager.UpdateAPIRevisionAsync(revision, languageService, verifyUpgradabilityOnly);
439457
}
440458
catch (Exception e)
441459
{

0 commit comments

Comments
 (0)