Update variant analysis monitor to get the whole variant analysis object (#3415)

This commit is contained in:
Charis Kyriakou
2024-02-28 12:12:27 +00:00
committed by GitHub
parent b884cff14d
commit 23bbff230f
3 changed files with 41 additions and 37 deletions

View File

@@ -146,7 +146,7 @@ export class VariantAnalysisManager
new VariantAnalysisMonitor(
app,
this.shouldCancelMonitorVariantAnalysis.bind(this),
this.getVariantAnalysisStatus.bind(this),
this.getVariantAnalysis.bind(this),
),
);
this.variantAnalysisMonitor.onVariantAnalysisChange(
@@ -606,17 +606,14 @@ export class VariantAnalysisManager
return !this.variantAnalyses.has(variantAnalysisId);
}
private getVariantAnalysisStatus(
variantAnalysisId: number,
): VariantAnalysisStatus {
const variantAnalysis = this.variantAnalyses.get(variantAnalysisId);
private getVariantAnalysis(variantAnalysisId: number): VariantAnalysis {
const variantAnalysis = this.tryGetVariantAnalysis(variantAnalysisId);
if (!variantAnalysis) {
throw new Error(
`No variant analysis found with id: ${variantAnalysisId}.`,
);
throw new Error(`No variant analysis with id: ${variantAnalysisId}`);
}
return variantAnalysis.status;
return variantAnalysis;
}
public async onVariantAnalysisUpdated(

View File

@@ -5,7 +5,6 @@ import { RequestError } from "@octokit/request-error";
import type {
VariantAnalysis,
VariantAnalysisScannedRepository,
VariantAnalysisStatus,
} from "./shared/variant-analysis";
import {
isFinalVariantAnalysisStatus,
@@ -18,6 +17,7 @@ import { sleep } from "../common/time";
import { getErrorMessage } from "../common/helpers-pure";
import type { App } from "../common/app";
import { showAndLogWarningMessage } from "../common/logging";
import type { QueryLanguage } from "../common/query-language";
export class VariantAnalysisMonitor extends DisposableObject {
// With a sleep of 5 seconds, the maximum number of attempts takes
@@ -37,9 +37,9 @@ export class VariantAnalysisMonitor extends DisposableObject {
private readonly shouldCancelMonitor: (
variantAnalysisId: number,
) => Promise<boolean>,
private readonly getVariantAnalysisStatus: (
private readonly getVariantAnalysis: (
variantAnalysisId: number,
) => VariantAnalysisStatus,
) => VariantAnalysis,
) {
super();
}
@@ -60,20 +60,28 @@ export class VariantAnalysisMonitor extends DisposableObject {
this.monitoringVariantAnalyses.add(variantAnalysis.id);
try {
await this._monitorVariantAnalysis(variantAnalysis);
await this._monitorVariantAnalysis(
variantAnalysis.id,
variantAnalysis.controllerRepo.id,
variantAnalysis.executionStartTime,
variantAnalysis.query.name,
variantAnalysis.language,
);
} finally {
this.monitoringVariantAnalyses.delete(variantAnalysis.id);
}
}
private async _monitorVariantAnalysis(
variantAnalysis: VariantAnalysis,
variantAnalysisId: number,
controllerRepoId: number,
executionStartTime: number,
queryName: string,
language: QueryLanguage,
): Promise<void> {
const variantAnalysisLabel = `${variantAnalysis.query.name} (${
variantAnalysis.language
}) [${new Date(variantAnalysis.executionStartTime).toLocaleString(
env.language,
)}]`;
const variantAnalysisLabel = `${queryName} (${language}) [${new Date(
executionStartTime,
).toLocaleString(env.language)}]`;
let attemptCount = 0;
const scannedReposDownloaded: number[] = [];
@@ -83,7 +91,7 @@ export class VariantAnalysisMonitor extends DisposableObject {
while (attemptCount <= VariantAnalysisMonitor.maxAttemptCount) {
await sleep(VariantAnalysisMonitor.sleepTime);
if (await this.shouldCancelMonitor(variantAnalysis.id)) {
if (await this.shouldCancelMonitor(variantAnalysisId)) {
return;
}
@@ -91,8 +99,8 @@ export class VariantAnalysisMonitor extends DisposableObject {
try {
variantAnalysisSummary = await getVariantAnalysis(
this.app.credentials,
variantAnalysis.controllerRepo.id,
variantAnalysis.id,
controllerRepoId,
variantAnalysisId,
);
} catch (e) {
const errorMessage = getErrorMessage(e);
@@ -123,15 +131,10 @@ export class VariantAnalysisMonitor extends DisposableObject {
continue;
}
// Get the current status of the variant analysis as known by the rest
// of the app, because it may have been changed by the user and this code
// may not be aware of it yet.
const currentStatus = this.getVariantAnalysisStatus(variantAnalysis.id);
variantAnalysis = mapUpdatedVariantAnalysis(
{
...variantAnalysis,
status: currentStatus,
},
const variantAnalysis = mapUpdatedVariantAnalysis(
// Get the variant analysis as known by the rest of the app, because it may
// have been changed by the user and the monitors may not be aware of it yet.
this.getVariantAnalysis(variantAnalysisId),
variantAnalysisSummary,
);

View File

@@ -32,7 +32,7 @@ describe("Variant Analysis Monitor", () => {
>;
let variantAnalysisMonitor: VariantAnalysisMonitor;
let shouldCancelMonitor: jest.Mock<Promise<boolean>, [number]>;
let mockGetVariantAnalysisStatus: jest.Mock<VariantAnalysisStatus, [number]>;
let mockGetVariantAnalysis: jest.Mock<VariantAnalysis, [number]>;
let variantAnalysis: VariantAnalysis;
const onVariantAnalysisChangeSpy = jest.fn();
@@ -44,7 +44,7 @@ describe("Variant Analysis Monitor", () => {
variantAnalysis = createMockVariantAnalysis({});
shouldCancelMonitor = jest.fn();
mockGetVariantAnalysisStatus = jest.fn();
mockGetVariantAnalysis = jest.fn();
logger = createMockLogger();
@@ -56,7 +56,7 @@ describe("Variant Analysis Monitor", () => {
logger,
}),
shouldCancelMonitor,
mockGetVariantAnalysisStatus,
mockGetVariantAnalysis,
);
variantAnalysisMonitor.onVariantAnalysisChange(onVariantAnalysisChangeSpy);
@@ -64,6 +64,8 @@ describe("Variant Analysis Monitor", () => {
.spyOn(ghApiClient, "getVariantAnalysis")
.mockRejectedValue(new Error("Not mocked"));
mockGetVariantAnalysis.mockReturnValue(variantAnalysis);
limitNumberOfAttemptsToMonitor();
});
@@ -342,9 +344,11 @@ describe("Variant Analysis Monitor", () => {
describe("cancelation", () => {
it("should maintain canceling status", async () => {
mockGetVariantAnalysisStatus.mockReturnValueOnce(
VariantAnalysisStatus.Canceling,
);
mockGetVariantAnalysis.mockReturnValueOnce({
...variantAnalysis,
status: VariantAnalysisStatus.Canceling,
});
mockApiResponse = createMockApiResponse("in_progress");
mockGetVariantAnalysisFromApi.mockResolvedValue(mockApiResponse);