diff --git a/lib/entry-points.js b/lib/entry-points.js index 78a5f058af..3ee58bebb7 100644 --- a/lib/entry-points.js +++ b/lib/entry-points.js @@ -157473,22 +157473,18 @@ function dumpSarifFile(sarifPayload, outputDir, logger, uploadTarget) { logger.info(`Writing processed SARIF file to ${outputFile}`); fs21.writeFileSync(outputFile, sarifPayload); } -var STATUS_CHECK_FREQUENCY_MILLISECONDS = 5 * 1e3; -var STATUS_CHECK_TIMEOUT_MILLISECONDS = 2 * 60 * 1e3; +var STATUS_CHECK_INITIAL_BACKOFF_MILLISECONDS = 5 * 1e3; +var STATUS_CHECK_BACKOFF_MULTIPLIER = 2; +var STATUS_CHECK_MAX_TRIES = 5; async function waitForProcessing(repositoryNwo, sarifID, logger, options = { isUnsuccessfulExecution: false }) { logger.startGroup("Waiting for processing to finish"); try { const client = getApiClient(); - const statusCheckingStarted = Date.now(); - while (true) { - if (Date.now() > statusCheckingStarted + STATUS_CHECK_TIMEOUT_MILLISECONDS) { - logger.warning( - "Timed out waiting for analysis to finish processing. Continuing." - ); - break; - } + let statusCheckBackoff = STATUS_CHECK_INITIAL_BACKOFF_MILLISECONDS; + await delay(statusCheckBackoff, { allowProcessExit: false }); + for (let statusCheckCount = 1; statusCheckCount <= STATUS_CHECK_MAX_TRIES; statusCheckCount++) { let response = void 0; try { response = await client.request( @@ -157526,9 +157522,15 @@ ${response.data.errors}`; } else { assertNever(status); } - await delay(STATUS_CHECK_FREQUENCY_MILLISECONDS, { - allowProcessExit: false - }); + if (statusCheckCount === STATUS_CHECK_MAX_TRIES) { + logger.warning( + "Timed out waiting for analysis to finish processing. Continuing." + ); + break; + } else { + statusCheckBackoff *= STATUS_CHECK_BACKOFF_MULTIPLIER; + await delay(statusCheckBackoff, { allowProcessExit: false }); + } } } finally { logger.endGroup(); diff --git a/src/upload-lib.ts b/src/upload-lib.ts index 83331aeed9..005227ea78 100644 --- a/src/upload-lib.ts +++ b/src/upload-lib.ts @@ -829,8 +829,10 @@ function dumpSarifFile( fs.writeFileSync(outputFile, sarifPayload); } -const STATUS_CHECK_FREQUENCY_MILLISECONDS = 5 * 1000; -const STATUS_CHECK_TIMEOUT_MILLISECONDS = 2 * 60 * 1000; +// Should lead to status checks after 5s, 15s, 35s, 75s, and 155s. +const STATUS_CHECK_INITIAL_BACKOFF_MILLISECONDS = 5 * 1000; +const STATUS_CHECK_BACKOFF_MULTIPLIER = 2; +const STATUS_CHECK_MAX_TRIES = 5; type ProcessingStatus = "pending" | "complete" | "failed"; @@ -854,20 +856,15 @@ export async function waitForProcessing( try { const client = api.getApiClient(); - const statusCheckingStarted = Date.now(); - while (true) { - if ( - Date.now() > - statusCheckingStarted + STATUS_CHECK_TIMEOUT_MILLISECONDS - ) { - // If the analysis hasn't finished processing in the allotted time, we continue anyway rather than failing. - // It's possible the analysis will eventually finish processing, but it's not worth spending more - // Actions time waiting. - logger.warning( - "Timed out waiting for analysis to finish processing. Continuing.", - ); - break; - } + // Do an initial wait because processing will always take a minimum of 2-3 seconds + let statusCheckBackoff = STATUS_CHECK_INITIAL_BACKOFF_MILLISECONDS; + await util.delay(statusCheckBackoff, { allowProcessExit: false }); + + for ( + let statusCheckCount = 1; + statusCheckCount <= STATUS_CHECK_MAX_TRIES; + statusCheckCount++ + ) { let response: OctokitResponse | undefined = undefined; try { response = await client.request( @@ -912,9 +909,18 @@ export async function waitForProcessing( util.assertNever(status); } - await util.delay(STATUS_CHECK_FREQUENCY_MILLISECONDS, { - allowProcessExit: false, - }); + if (statusCheckCount === STATUS_CHECK_MAX_TRIES) { + // If the analysis hasn't finished processing in the allotted time, we continue anyway rather than failing. + // It's possible the analysis will eventually finish processing, but it's not worth spending more + // Actions time waiting. + logger.warning( + "Timed out waiting for analysis to finish processing. Continuing.", + ); + break; + } else { + statusCheckBackoff *= STATUS_CHECK_BACKOFF_MULTIPLIER; + await util.delay(statusCheckBackoff, { allowProcessExit: false }); + } } } finally { logger.endGroup();