diff --git a/lib/analyze-action-post.js b/lib/analyze-action-post.js index d815da082f..de3b89b111 100644 --- a/lib/analyze-action-post.js +++ b/lib/analyze-action-post.js @@ -120102,6 +120102,8 @@ var featureConfig = { var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB = 2e4; +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES = OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB * 1e6; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, diff --git a/lib/analyze-action.js b/lib/analyze-action.js index 5dcfd5062e..d80524b30c 100644 --- a/lib/analyze-action.js +++ b/lib/analyze-action.js @@ -89370,6 +89370,8 @@ async function cachePrefix(codeql, language) { } // src/config-utils.ts +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB = 2e4; +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES = OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB * 1e6; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, diff --git a/lib/autobuild-action.js b/lib/autobuild-action.js index 2655e43157..e9807b9d69 100644 --- a/lib/autobuild-action.js +++ b/lib/autobuild-action.js @@ -84416,6 +84416,8 @@ var GitHubFeatureFlags = class { var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB = 2e4; +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES = OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB * 1e6; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, diff --git a/lib/init-action-post.js b/lib/init-action-post.js index c238f7d069..45f90f0358 100644 --- a/lib/init-action-post.js +++ b/lib/init-action-post.js @@ -123766,6 +123766,8 @@ ${jsonContents}` var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB = 2e4; +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES = OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB * 1e6; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, diff --git a/lib/init-action.js b/lib/init-action.js index 6de0e4e2db..ff9b723332 100644 --- a/lib/init-action.js +++ b/lib/init-action.js @@ -86653,6 +86653,8 @@ async function cachePrefix(codeql, language) { } // src/config-utils.ts +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB = 2e4; +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES = OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB * 1e6; async function getSupportedLanguageMap(codeql, logger) { const resolveSupportedLanguagesUsingCli = await codeql.supportsFeature( "builtinExtractorsSpecifyDefaultQueries" /* BuiltinExtractorsSpecifyDefaultQueries */ @@ -86924,18 +86926,28 @@ async function getOverlayDatabaseMode(codeql, features, languages, sourceRoot, b languages, codeScanningConfig )) { - if (isAnalyzingPullRequest()) { - overlayDatabaseMode = "overlay" /* Overlay */; - useOverlayDatabaseCaching = true; + const diskUsage = await checkDiskUsage(logger); + if (diskUsage === void 0 || diskUsage.numAvailableBytes < OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES) { + const diskSpaceMb = diskUsage === void 0 ? 0 : Math.round(diskUsage.numAvailableBytes / 1e6); + overlayDatabaseMode = "none" /* None */; + useOverlayDatabaseCaching = false; logger.info( - `Setting overlay database mode to ${overlayDatabaseMode} with caching because we are analyzing a pull request.` - ); - } else if (await isAnalyzingDefaultBranch()) { - overlayDatabaseMode = "overlay-base" /* OverlayBase */; - useOverlayDatabaseCaching = true; - logger.info( - `Setting overlay database mode to ${overlayDatabaseMode} with caching because we are analyzing the default branch.` + `Setting overlay database mode to ${overlayDatabaseMode} due to insufficient disk space (${diskSpaceMb} MB).` ); + } else { + if (isAnalyzingPullRequest()) { + overlayDatabaseMode = "overlay" /* Overlay */; + useOverlayDatabaseCaching = true; + logger.info( + `Setting overlay database mode to ${overlayDatabaseMode} with caching because we are analyzing a pull request.` + ); + } else if (await isAnalyzingDefaultBranch()) { + overlayDatabaseMode = "overlay-base" /* OverlayBase */; + useOverlayDatabaseCaching = true; + logger.info( + `Setting overlay database mode to ${overlayDatabaseMode} with caching because we are analyzing the default branch.` + ); + } } } const nonOverlayAnalysis = { diff --git a/lib/resolve-environment-action.js b/lib/resolve-environment-action.js index 8a757d8c61..8bfc24ca03 100644 --- a/lib/resolve-environment-action.js +++ b/lib/resolve-environment-action.js @@ -84142,6 +84142,8 @@ var featureConfig = { var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB = 2e4; +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES = OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB * 1e6; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, diff --git a/lib/setup-codeql-action.js b/lib/setup-codeql-action.js index 31f135f53c..ccd2157ad7 100644 --- a/lib/setup-codeql-action.js +++ b/lib/setup-codeql-action.js @@ -84587,6 +84587,8 @@ var PACK_IDENTIFIER_PATTERN = (function() { var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB = 2e4; +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES = OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB * 1e6; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, diff --git a/lib/start-proxy-action-post.js b/lib/start-proxy-action-post.js index 86991078ab..c22306a3b4 100644 --- a/lib/start-proxy-action-post.js +++ b/lib/start-proxy-action-post.js @@ -119508,6 +119508,8 @@ var featureConfig = { var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB = 2e4; +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES = OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB * 1e6; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, diff --git a/lib/start-proxy-action.js b/lib/start-proxy-action.js index 3b6d4deca5..e54c456eb5 100644 --- a/lib/start-proxy-action.js +++ b/lib/start-proxy-action.js @@ -100170,6 +100170,8 @@ var featureConfig = { var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB = 2e4; +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES = OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB * 1e6; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, diff --git a/lib/upload-lib.js b/lib/upload-lib.js index e9e0a6747c..3b951984b5 100644 --- a/lib/upload-lib.js +++ b/lib/upload-lib.js @@ -87226,6 +87226,8 @@ ${jsonContents}` var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB = 2e4; +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES = OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB * 1e6; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, diff --git a/lib/upload-sarif-action-post.js b/lib/upload-sarif-action-post.js index 96a6bc64be..4c6f138026 100644 --- a/lib/upload-sarif-action-post.js +++ b/lib/upload-sarif-action-post.js @@ -119674,6 +119674,8 @@ var featureConfig = { var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB = 2e4; +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES = OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB * 1e6; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, diff --git a/lib/upload-sarif-action.js b/lib/upload-sarif-action.js index 6db9c67bdf..b6eaf19a0f 100644 --- a/lib/upload-sarif-action.js +++ b/lib/upload-sarif-action.js @@ -87307,6 +87307,8 @@ ${jsonContents}` var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB = 2e4; +var OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES = OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB * 1e6; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, diff --git a/src/config-utils.test.ts b/src/config-utils.test.ts index da58dd8b1b..b9407152b9 100644 --- a/src/config-utils.test.ts +++ b/src/config-utils.test.ts @@ -37,7 +37,9 @@ import { ConfigurationError, withTmpDir, BuildMode, + DiskUsage, } from "./util"; +import * as util from "./util"; setupTests(test); @@ -995,6 +997,7 @@ interface OverlayDatabaseModeTestSetup { codeqlVersion: string; gitRoot: string | undefined; codeScanningConfig: configUtils.UserConfig; + diskUsage: DiskUsage | undefined; } const defaultOverlayDatabaseModeTestSetup: OverlayDatabaseModeTestSetup = { @@ -1007,6 +1010,10 @@ const defaultOverlayDatabaseModeTestSetup: OverlayDatabaseModeTestSetup = { codeqlVersion: CODEQL_OVERLAY_MINIMUM_VERSION, gitRoot: "/some/git/root", codeScanningConfig: {}, + diskUsage: { + numAvailableBytes: 50_000_000_000, + numTotalBytes: 100_000_000_000, + }, }; const getOverlayDatabaseModeMacro = test.macro({ @@ -1039,6 +1046,8 @@ const getOverlayDatabaseModeMacro = test.macro({ setup.overlayDatabaseEnvVar; } + sinon.stub(util, "checkDiskUsage").resolves(setup.diskUsage); + // Mock feature flags const features = createFeatures(setup.features); @@ -1196,6 +1205,45 @@ test( }, ); +test( + getOverlayDatabaseModeMacro, + "No overlay-base database on default branch if runner disk space is too low", + { + languages: [KnownLanguage.javascript], + features: [ + Feature.OverlayAnalysis, + Feature.OverlayAnalysisCodeScanningJavascript, + ], + isDefaultBranch: true, + diskUsage: { + numAvailableBytes: 1_000_000_000, + numTotalBytes: 100_000_000_000, + }, + }, + { + overlayDatabaseMode: OverlayDatabaseMode.None, + useOverlayDatabaseCaching: false, + }, +); + +test( + getOverlayDatabaseModeMacro, + "No overlay-base database on default branch if we can't determine runner disk space", + { + languages: [KnownLanguage.javascript], + features: [ + Feature.OverlayAnalysis, + Feature.OverlayAnalysisCodeScanningJavascript, + ], + isDefaultBranch: true, + diskUsage: undefined, + }, + { + overlayDatabaseMode: OverlayDatabaseMode.None, + useOverlayDatabaseCaching: false, + }, +); + test( getOverlayDatabaseModeMacro, "No overlay-base database on default branch when code-scanning feature enabled with disable-default-queries", @@ -1366,6 +1414,45 @@ test( }, ); +test( + getOverlayDatabaseModeMacro, + "No overlay analysis on PR if runner disk space is too low", + { + languages: [KnownLanguage.javascript], + features: [ + Feature.OverlayAnalysis, + Feature.OverlayAnalysisCodeScanningJavascript, + ], + isPullRequest: true, + diskUsage: { + numAvailableBytes: 1_000_000_000, + numTotalBytes: 100_000_000_000, + }, + }, + { + overlayDatabaseMode: OverlayDatabaseMode.None, + useOverlayDatabaseCaching: false, + }, +); + +test( + getOverlayDatabaseModeMacro, + "No overlay analysis on PR if we can't determine runner disk space", + { + languages: [KnownLanguage.javascript], + features: [ + Feature.OverlayAnalysis, + Feature.OverlayAnalysisCodeScanningJavascript, + ], + isPullRequest: true, + diskUsage: undefined, + }, + { + overlayDatabaseMode: OverlayDatabaseMode.None, + useOverlayDatabaseCaching: false, + }, +); + test( getOverlayDatabaseModeMacro, "No overlay analysis on PR when code-scanning feature enabled with disable-default-queries", @@ -1500,6 +1587,19 @@ test( }, ); +test( + getOverlayDatabaseModeMacro, + "Overlay PR analysis by env on a runner with low disk space", + { + overlayDatabaseEnvVar: "overlay", + diskUsage: { numAvailableBytes: 0, numTotalBytes: 100_000_000_000 }, + }, + { + overlayDatabaseMode: OverlayDatabaseMode.Overlay, + useOverlayDatabaseCaching: false, + }, +); + test( getOverlayDatabaseModeMacro, "Overlay PR analysis by feature flag", diff --git a/src/config-utils.ts b/src/config-utils.ts index fa88d4b4a5..2572573448 100644 --- a/src/config-utils.ts +++ b/src/config-utils.ts @@ -43,10 +43,22 @@ import { codeQlVersionAtLeast, cloneObject, isDefined, + checkDiskUsage, } from "./util"; export * from "./config/db-config"; +/** + * The minimum available disk space (in MB) required to perform overlay analysis. + * If the available disk space on the runner is below the threshold when deciding + * whether to perform overlay analysis, then the action will not perform overlay + * analysis unless overlay analysis has been explicitly enabled via environment + * variable. + */ +const OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB = 20000; +const OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES = + OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB * 1_000_000; + export type RegistryConfigWithCredentials = RegistryConfigNoCredentials & { // Token to use when downloading packs from this registry. token: string; @@ -675,20 +687,37 @@ export async function getOverlayDatabaseMode( codeScanningConfig, ) ) { - if (isAnalyzingPullRequest()) { - overlayDatabaseMode = OverlayDatabaseMode.Overlay; - useOverlayDatabaseCaching = true; - logger.info( - `Setting overlay database mode to ${overlayDatabaseMode} ` + - "with caching because we are analyzing a pull request.", - ); - } else if (await isAnalyzingDefaultBranch()) { - overlayDatabaseMode = OverlayDatabaseMode.OverlayBase; - useOverlayDatabaseCaching = true; + const diskUsage = await checkDiskUsage(logger); + if ( + diskUsage === undefined || + diskUsage.numAvailableBytes < OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES + ) { + const diskSpaceMb = + diskUsage === undefined + ? 0 + : Math.round(diskUsage.numAvailableBytes / 1_000_000); + overlayDatabaseMode = OverlayDatabaseMode.None; + useOverlayDatabaseCaching = false; logger.info( `Setting overlay database mode to ${overlayDatabaseMode} ` + - "with caching because we are analyzing the default branch.", + `due to insufficient disk space (${diskSpaceMb} MB).`, ); + } else { + if (isAnalyzingPullRequest()) { + overlayDatabaseMode = OverlayDatabaseMode.Overlay; + useOverlayDatabaseCaching = true; + logger.info( + `Setting overlay database mode to ${overlayDatabaseMode} ` + + "with caching because we are analyzing a pull request.", + ); + } else if (await isAnalyzingDefaultBranch()) { + overlayDatabaseMode = OverlayDatabaseMode.OverlayBase; + useOverlayDatabaseCaching = true; + logger.info( + `Setting overlay database mode to ${overlayDatabaseMode} ` + + "with caching because we are analyzing the default branch.", + ); + } } }