@@ -48,7 +48,7 @@ import {
4848import { prepareDiffInformedAnalysis } from "./diff-informed-analysis-utils" ;
4949import { EnvVar } from "./environment" ;
5050import * as errorMessages from "./error-messages" ;
51- import { Feature , FeatureEnablement } from "./feature-flags" ;
51+ import { Feature , FeatureEnablement , FeatureWithoutCLI } from "./feature-flags" ;
5252import {
5353 RepositoryProperties ,
5454 RepositoryPropertyName ,
@@ -101,10 +101,23 @@ export { type Config } from "./config/action-config";
101101 * whether to perform overlay analysis, then the action will not perform overlay
102102 * analysis unless overlay analysis has been explicitly enabled via environment
103103 * variable.
104+ *
105+ * This threshold can be lowered by the feature flags in
106+ * `OVERLAY_MINIMUM_DISK_SPACE_MB_BY_FEATURE`.
104107 */
105108const OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB = 14000 ;
106- const OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES =
107- OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB * 1_000_000 ;
109+
110+ /**
111+ * Minimum available disk space (in MB) enabled by each overlay feature flag.
112+ */
113+ const OVERLAY_MINIMUM_DISK_SPACE_MB_BY_FEATURE = {
114+ [ Feature . OverlayAnalysisMinDisk8Gb ] : 8000 ,
115+ [ Feature . OverlayAnalysisMinDisk9Gb ] : 9000 ,
116+ [ Feature . OverlayAnalysisMinDisk10Gb ] : 10000 ,
117+ [ Feature . OverlayAnalysisMinDisk11Gb ] : 11000 ,
118+ [ Feature . OverlayAnalysisMinDisk12Gb ] : 12000 ,
119+ [ Feature . OverlayAnalysisMinDisk13Gb ] : 13000 ,
120+ } satisfies Partial < Record < FeatureWithoutCLI , number > > ;
108121
109122/**
110123 * The minimum memory (in MB) that must be available for CodeQL to perform overlay analysis. If
@@ -579,21 +592,44 @@ async function checkOverlayAnalysisFeatureEnabled(
579592 return new Success ( undefined ) ;
580593}
581594
595+ /**
596+ * Returns the minimum available disk space (in MB) required to perform overlay
597+ * analysis, which is the lowest threshold enabled by a feature flag, or the
598+ * default threshold if no such feature flag is enabled.
599+ */
600+ async function getMinimumDiskSpaceMb (
601+ features : FeatureEnablement ,
602+ ) : Promise < number > {
603+ let minimumMb = OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_MB ;
604+ for ( const [ feature , thresholdMb ] of Object . entries (
605+ OVERLAY_MINIMUM_DISK_SPACE_MB_BY_FEATURE ,
606+ ) ) {
607+ if ( await features . getValue ( feature as FeatureWithoutCLI ) ) {
608+ minimumMb = Math . min ( minimumMb , thresholdMb ) ;
609+ }
610+ }
611+ return minimumMb ;
612+ }
613+
582614/** Checks if the runner has enough disk space for overlay analysis. */
583615function runnerHasSufficientDiskSpace (
584616 diskUsage : DiskUsage ,
585617 logger : Logger ,
618+ minimumDiskSpaceMb : number ,
586619) : boolean {
587- const minimumDiskSpaceBytes = OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES ;
588- if ( diskUsage . numAvailableBytes < minimumDiskSpaceBytes ) {
589- const diskSpaceMb = Math . round ( diskUsage . numAvailableBytes / 1_000_000 ) ;
590- const minimumDiskSpaceMb = Math . round ( minimumDiskSpaceBytes / 1_000_000 ) ;
620+ const diskSpaceMb = Math . round ( diskUsage . numAvailableBytes / 1_000_000 ) ;
621+ if ( diskUsage . numAvailableBytes < minimumDiskSpaceMb * 1_000_000 ) {
591622 logger . info (
592623 `Setting overlay database mode to ${ OverlayDatabaseMode . None } ` +
593624 `due to insufficient disk space (${ diskSpaceMb } MB, needed ${ minimumDiskSpaceMb } MB).` ,
594625 ) ;
595626 return false ;
596627 }
628+
629+ logger . debug (
630+ `Disk space available for CodeQL analysis is ${ diskSpaceMb } MB, which is at or above the ` +
631+ `minimum of ${ minimumDiskSpaceMb } MB.` ,
632+ ) ;
597633 return true ;
598634}
599635
@@ -625,7 +661,7 @@ async function runnerHasSufficientMemory(
625661 }
626662
627663 logger . debug (
628- `Memory available for CodeQL analysis is ${ memoryFlagValue } MB, which is above the minimum of ${ OVERLAY_MINIMUM_MEMORY_MB } MB.` ,
664+ `Memory available for CodeQL analysis is ${ memoryFlagValue } MB, which is at or above the minimum of ${ OVERLAY_MINIMUM_MEMORY_MB } MB.` ,
629665 ) ;
630666 return true ;
631667}
@@ -636,11 +672,13 @@ async function runnerHasSufficientMemory(
636672 */
637673async function checkRunnerResources (
638674 codeql : CodeQL ,
675+ features : FeatureEnablement ,
639676 diskUsage : DiskUsage ,
640677 ramInput : string | undefined ,
641678 logger : Logger ,
642679) : Promise < Result < void , OverlayDisabledReason > > {
643- if ( ! runnerHasSufficientDiskSpace ( diskUsage , logger ) ) {
680+ const minimumDiskSpaceMb = await getMinimumDiskSpaceMb ( features ) ;
681+ if ( ! runnerHasSufficientDiskSpace ( diskUsage , logger , minimumDiskSpaceMb ) ) {
644682 return new Failure ( OverlayDisabledReason . InsufficientDiskSpace ) ;
645683 }
646684 if ( ! ( await runnerHasSufficientMemory ( codeql , ramInput , logger ) ) ) {
@@ -752,7 +790,13 @@ export async function checkOverlayEnablement(
752790 }
753791 const resourceResult =
754792 performResourceChecks && diskUsage !== undefined
755- ? await checkRunnerResources ( codeql , diskUsage , ramInput , logger )
793+ ? await checkRunnerResources (
794+ codeql ,
795+ features ,
796+ diskUsage ,
797+ ramInput ,
798+ logger ,
799+ )
756800 : new Success < void > ( undefined ) ;
757801 if ( resourceResult . isFailure ( ) ) {
758802 return resourceResult ;
0 commit comments