From 69ae4e10910f9f329fd175535a6cb16ce72dc395 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sat, 18 Jul 2026 03:10:48 -0700 Subject: [PATCH 01/16] Cycle locations. --- azure-devops/create-1es-hosted-pool.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-devops/create-1es-hosted-pool.ps1 b/azure-devops/create-1es-hosted-pool.ps1 index 037a33ea65..06325f7284 100644 --- a/azure-devops/create-1es-hosted-pool.ps1 +++ b/azure-devops/create-1es-hosted-pool.ps1 @@ -47,7 +47,7 @@ if ($VMSku -ieq 'Fasv6') { $AvailableLocations = @('australiaeast', 'southcentralus') } -$AvailableLocationIdx = 11 # Increment for each new set of pools, to cycle through the available locations. +$AvailableLocationIdx = 12 # Increment for each new set of pools, to cycle through the available locations. $Location = $AvailableLocations[$AvailableLocationIdx % $AvailableLocations.Length] if ($Arch -ieq 'x64') { From 9ec80419c3a4b45c80f7ad9165b0e389f0caf0e7 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sat, 18 Jul 2026 03:17:48 -0700 Subject: [PATCH 02/16] Got quota for 2048 cores of Fadsv7 in australiaeast. --- azure-devops/create-1es-hosted-pool.ps1 | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/azure-devops/create-1es-hosted-pool.ps1 b/azure-devops/create-1es-hosted-pool.ps1 index 06325f7284..e2a9f29419 100644 --- a/azure-devops/create-1es-hosted-pool.ps1 +++ b/azure-devops/create-1es-hosted-pool.ps1 @@ -9,11 +9,11 @@ Creates a 1ES Hosted Pool, set up for the STL's CI. See https://github.com/microsoft/STL/wiki/Checklist-for-Toolset-Updates for more information. .PARAMETER VMSku -The VM SKU can be Fasv6, Fasv7, or Dpdsv6. +The VM SKU can be Fasv6, Fasv7, Fadsv7, or Dpdsv6. #> [CmdletBinding(PositionalBinding=$false)] Param( - [Parameter(Mandatory)][ValidateSet('Fasv6', 'Fasv7', 'Dpdsv6')][String]$VMSku + [Parameter(Mandatory)][ValidateSet('Fasv6', 'Fasv7', 'Fadsv7', 'Dpdsv6')][String]$VMSku ) $ErrorActionPreference = 'Stop' @@ -27,6 +27,7 @@ $Timestamp = $CurrentDate.ToString('yyyy-MM-ddTHHmm') # | Fasv7 | australiaeast | 740 | | # | Fasv7 | northeurope | 640 | | # | Fasv7 | southeastasia | 640 | | +# | Fadsv7 | australiaeast | 2048 | | # | Dpdsv6 | australiaeast | 2048 | | # | Dpdsv6 | southcentralus | 2048 | | @@ -40,6 +41,11 @@ if ($VMSku -ieq 'Fasv6') { $VMSize = 'Standard_F32as_v7' $PoolSize = 20 # Locations where we have quota for at least 640 cores (20 VMs): $AvailableLocations = @('australiaeast', 'northeurope', 'southeastasia') +} elseif ($VMSku -ieq 'Fadsv7') { + $Arch = 'x64' + $VMSize = 'Standard_F32ads_v7' + $PoolSize = 32 # We have quota for 2048 cores (64 VMs), so we can have old and new pools of 32 VMs each. + $AvailableLocations = @('australiaeast') } elseif ($VMSku -ieq 'Dpdsv6') { $Arch = 'arm64' $VMSize = 'Standard_D32pds_v6' From 20af2dbef22c06b5239bf61114f7c0d62f4e04aa Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sat, 18 Jul 2026 05:11:01 -0700 Subject: [PATCH 03/16] Change 6 initial stages to use a Medium pool. Test_x86, Test_x64_ASan, Test_x86_ASan remain Slow. Test_x64 remains Fast. --- azure-pipelines.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 9edfc85a9b..c50e0222e9 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -14,7 +14,7 @@ stages: dependsOn: [] displayName: 'Code Format' pool: - name: ${{ variables.x64SlowPoolName }} + name: ${{ variables.x64MediumPoolName }} demands: ${{ variables.poolDemands }} variables: - name: workRoot @@ -27,7 +27,7 @@ stages: dependsOn: [] displayName: 'Build x64' pool: - name: ${{ variables.x64SlowPoolName }} + name: ${{ variables.x64MediumPoolName }} demands: ${{ variables.poolDemands }} variables: - name: workRoot @@ -49,7 +49,7 @@ stages: dependsOn: [] displayName: 'Build x86' pool: - name: ${{ variables.x64SlowPoolName }} + name: ${{ variables.x64MediumPoolName }} demands: ${{ variables.poolDemands }} variables: - name: workRoot @@ -71,7 +71,7 @@ stages: dependsOn: [] displayName: 'Build ARM64 (Cross)' pool: - name: ${{ variables.x64SlowPoolName }} + name: ${{ variables.x64MediumPoolName }} demands: ${{ variables.poolDemands }} variables: - name: workRoot @@ -93,7 +93,7 @@ stages: dependsOn: [] displayName: 'Build ARM64EC (Cross)' pool: - name: ${{ variables.x64SlowPoolName }} + name: ${{ variables.x64MediumPoolName }} demands: ${{ variables.poolDemands }} variables: - name: workRoot @@ -139,7 +139,7 @@ stages: dependsOn: [] displayName: 'Configure Tests' pool: - name: ${{ variables.x64SlowPoolName }} + name: ${{ variables.x64MediumPoolName }} demands: ${{ variables.poolDemands }} variables: - name: workRoot From 1bda442ebe318ac42c086063d25c52054785dc94 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sat, 18 Jul 2026 05:17:08 -0700 Subject: [PATCH 04/16] Split work root usage into Slow/Medium/Fast. --- azure-devops/asan-pipeline.yml | 4 ++-- azure-pipelines.yml | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/azure-devops/asan-pipeline.yml b/azure-devops/asan-pipeline.yml index 4879cc48d4..985520ff41 100644 --- a/azure-devops/asan-pipeline.yml +++ b/azure-devops/asan-pipeline.yml @@ -24,7 +24,7 @@ stages: demands: ${{ variables.poolDemands }} variables: - name: workRoot - value: '$(x64PoolWorkRoot)' + value: '$(x64SlowPoolWorkRoot)' readonly: true jobs: - template: build-and-test.yml @@ -43,7 +43,7 @@ stages: demands: ${{ variables.poolDemands }} variables: - name: workRoot - value: '$(x64PoolWorkRoot)' + value: '$(x64SlowPoolWorkRoot)' readonly: true jobs: - template: build-and-test.yml diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c50e0222e9..8a2509bb66 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -18,7 +18,7 @@ stages: demands: ${{ variables.poolDemands }} variables: - name: workRoot - value: '$(x64PoolWorkRoot)' + value: '$(x64MediumPoolWorkRoot)' readonly: true jobs: - template: azure-devops/format-validation.yml @@ -31,7 +31,7 @@ stages: demands: ${{ variables.poolDemands }} variables: - name: workRoot - value: '$(x64PoolWorkRoot)' + value: '$(x64MediumPoolWorkRoot)' readonly: true jobs: - template: azure-devops/build-and-test.yml @@ -53,7 +53,7 @@ stages: demands: ${{ variables.poolDemands }} variables: - name: workRoot - value: '$(x64PoolWorkRoot)' + value: '$(x64MediumPoolWorkRoot)' readonly: true jobs: - template: azure-devops/build-and-test.yml @@ -75,7 +75,7 @@ stages: demands: ${{ variables.poolDemands }} variables: - name: workRoot - value: '$(x64PoolWorkRoot)' + value: '$(x64MediumPoolWorkRoot)' readonly: true jobs: - template: azure-devops/build-and-test.yml @@ -97,7 +97,7 @@ stages: demands: ${{ variables.poolDemands }} variables: - name: workRoot - value: '$(x64PoolWorkRoot)' + value: '$(x64MediumPoolWorkRoot)' readonly: true jobs: - template: azure-devops/build-and-test.yml @@ -143,7 +143,7 @@ stages: demands: ${{ variables.poolDemands }} variables: - name: workRoot - value: '$(x64PoolWorkRoot)' + value: '$(x64MediumPoolWorkRoot)' readonly: true jobs: - template: azure-devops/build-and-test.yml @@ -169,7 +169,7 @@ stages: demands: ${{ variables.poolDemands }} variables: - name: workRoot - value: '$(x64PoolWorkRoot)' + value: '$(x64FastPoolWorkRoot)' readonly: true jobs: - template: azure-devops/build-and-test.yml @@ -186,7 +186,7 @@ stages: demands: ${{ variables.poolDemands }} variables: - name: workRoot - value: '$(x64PoolWorkRoot)' + value: '$(x64SlowPoolWorkRoot)' readonly: true jobs: - template: azure-devops/build-and-test.yml From ed560550daf788bf922e009c394b5a3af6b59f59 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sat, 18 Jul 2026 05:19:37 -0700 Subject: [PATCH 05/16] Split pools and work roots into Slow/Medium/Fast. --- azure-devops/config.yml | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/azure-devops/config.yml b/azure-devops/config.yml index 4cce273f81..910463db16 100644 --- a/azure-devops/config.yml +++ b/azure-devops/config.yml @@ -5,13 +5,16 @@ variables: - name: x64SlowPoolName - value: 'Stl-2026-07-15T0800-x64-Fasv6-Pool' + value: 'Stl-FIXME-x64-Fasv6-Pool' + readonly: true +- name: x64MediumPoolName + value: 'Stl-FIXME-x64-Fasv7-Pool' readonly: true - name: x64FastPoolName - value: 'Stl-2026-07-15T0800-x64-Fasv7-Pool' + value: 'Stl-FIXME-x64-Fadsv7-Pool' readonly: true - name: arm64PoolName - value: 'Stl-2026-07-15T0800-arm64-Dpdsv6-Pool' + value: 'Stl-FIXME-arm64-Dpdsv6-Pool' readonly: true - name: poolDemands value: 'EnableSpotVM -equals false' @@ -19,11 +22,18 @@ variables: - name: launchVsDevShell value: 'C:\Program Files\Microsoft Visual Studio\18\Insiders\Common7\Tools\Launch-VsDevShell.ps1' readonly: true -# The x64 SKUs Fasv6 and Fasv7 don't have local temporary storage, so they must use 'C:'. -# When we can use Fadsv7, local temporary storage should be available as 'N:'. -- name: x64PoolWorkRoot +# The x64 SKU Fasv6 doesn't have local temporary storage, so it must use 'C:'. +- name: x64SlowPoolWorkRoot + value: 'C:' + readonly: true +# The x64 SKU Fasv7 doesn't have local temporary storage, so it must use 'C:'. +- name: x64MediumPoolWorkRoot value: 'C:' readonly: true +# The x64 SKU Fadsv7 has local temporary storage, available as 'N:' (for NVMe). +- name: x64FastPoolWorkRoot + value: 'N:' + readonly: true # The arm64 SKU Dpdsv6 has local temporary storage, available as 'E:'. - name: arm64PoolWorkRoot value: 'E:' From 90ed570a77c4d3468a4d5e59876fe0f3996b29cc Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sat, 18 Jul 2026 07:33:15 -0700 Subject: [PATCH 06/16] Move Test_x86 down, no other changes. --- azure-pipelines.yml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 8a2509bb66..a526ecd336 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -178,23 +178,6 @@ stages: targetArch: x64 targetPlatform: x64 - - stage: Test_x86 - dependsOn: Test_x64 - displayName: 'Test x86' - pool: - name: ${{ variables.x64SlowPoolName }} - demands: ${{ variables.poolDemands }} - variables: - - name: workRoot - value: '$(x64SlowPoolWorkRoot)' - readonly: true - jobs: - - template: azure-devops/build-and-test.yml - parameters: - hostArch: x86 - targetArch: x86 - targetPlatform: x86 - - stage: Test_ARM64 dependsOn: - Build_ARM64_Native @@ -214,6 +197,23 @@ stages: targetArch: arm64 targetPlatform: arm64 + - stage: Test_x86 + dependsOn: Test_x64 + displayName: 'Test x86' + pool: + name: ${{ variables.x64SlowPoolName }} + demands: ${{ variables.poolDemands }} + variables: + - name: workRoot + value: '$(x64SlowPoolWorkRoot)' + readonly: true + jobs: + - template: azure-devops/build-and-test.yml + parameters: + hostArch: x86 + targetArch: x86 + targetPlatform: x86 + - stage: Test_ARM64EC dependsOn: - Build_ARM64_Native From 8113d26a5940c9be06b1e45a353ce20f41469314 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sat, 18 Jul 2026 07:46:40 -0700 Subject: [PATCH 07/16] Move Build_ARM64EC_Cross down, no other changes. --- azure-pipelines.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a526ecd336..a86b84623e 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -89,46 +89,46 @@ stages: configureTesting: false runTesting: false - - stage: Build_ARM64EC_Cross + # This ARM64-native build will detect problems with the ARM64 pool as early as possible. + # The stage dependencies are structured to optimize the critical path. + - stage: Build_ARM64_Native dependsOn: [] - displayName: 'Build ARM64EC (Cross)' + displayName: 'Build ARM64 (Native)' pool: - name: ${{ variables.x64MediumPoolName }} + name: ${{ variables.arm64PoolName }} demands: ${{ variables.poolDemands }} variables: - name: workRoot - value: '$(x64MediumPoolWorkRoot)' + value: '$(arm64PoolWorkRoot)' readonly: true jobs: - template: azure-devops/build-and-test.yml parameters: - hostArch: x64 + hostArch: arm64 targetArch: arm64 - targetPlatform: arm64ec + targetPlatform: arm64 analyzeBuild: true buildBenchmarks: true numShards: 1 configureTesting: false runTesting: false - # This ARM64-native build will detect problems with the ARM64 pool as early as possible. - # The stage dependencies are structured to optimize the critical path. - - stage: Build_ARM64_Native + - stage: Build_ARM64EC_Cross dependsOn: [] - displayName: 'Build ARM64 (Native)' + displayName: 'Build ARM64EC (Cross)' pool: - name: ${{ variables.arm64PoolName }} + name: ${{ variables.x64MediumPoolName }} demands: ${{ variables.poolDemands }} variables: - name: workRoot - value: '$(arm64PoolWorkRoot)' + value: '$(x64MediumPoolWorkRoot)' readonly: true jobs: - template: azure-devops/build-and-test.yml parameters: - hostArch: arm64 + hostArch: x64 targetArch: arm64 - targetPlatform: arm64 + targetPlatform: arm64ec analyzeBuild: true buildBenchmarks: true numShards: 1 From 0feee081cb03171e9e3fd820858c0ab9d00c5a66 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sat, 18 Jul 2026 07:48:23 -0700 Subject: [PATCH 08/16] Add Phase 1/2/3 comments. --- azure-pipelines.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a86b84623e..fdb37a5a0b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -10,6 +10,7 @@ pr: drafts: false stages: +##### Phase 1: Initial Builds ##### - stage: Code_Format dependsOn: [] displayName: 'Code Format' @@ -155,6 +156,7 @@ stages: buildStl: false runTesting: false +##### Phase 2: Primary Test Architectures ##### - stage: Test_x64 dependsOn: - Code_Format @@ -197,6 +199,7 @@ stages: targetArch: arm64 targetPlatform: arm64 +##### Phase 3: Secondary Test Architectures ##### - stage: Test_x86 dependsOn: Test_x64 displayName: 'Test x86' From c9e03d392be131115d454494fc5fe79210a8210a Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sat, 18 Jul 2026 07:56:17 -0700 Subject: [PATCH 09/16] Drop Build_ARM64_Cross. --- azure-pipelines.yml | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index fdb37a5a0b..2cf9c3ecc7 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -68,28 +68,6 @@ stages: configureTesting: false runTesting: false - - stage: Build_ARM64_Cross - dependsOn: [] - displayName: 'Build ARM64 (Cross)' - pool: - name: ${{ variables.x64MediumPoolName }} - demands: ${{ variables.poolDemands }} - variables: - - name: workRoot - value: '$(x64MediumPoolWorkRoot)' - readonly: true - jobs: - - template: azure-devops/build-and-test.yml - parameters: - hostArch: x64 - targetArch: arm64 - targetPlatform: arm64 - analyzeBuild: true - buildBenchmarks: true - numShards: 1 - configureTesting: false - runTesting: false - # This ARM64-native build will detect problems with the ARM64 pool as early as possible. # The stage dependencies are structured to optimize the critical path. - stage: Build_ARM64_Native From aad2c8e2e746bac25d64c3f22fff633837154210 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sat, 18 Jul 2026 07:56:50 -0700 Subject: [PATCH 10/16] Rename Build_ARM64_Native => Build_ARM64, drop outdated comments. --- azure-pipelines.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 2cf9c3ecc7..207ade5a0d 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -68,11 +68,9 @@ stages: configureTesting: false runTesting: false - # This ARM64-native build will detect problems with the ARM64 pool as early as possible. - # The stage dependencies are structured to optimize the critical path. - - stage: Build_ARM64_Native + - stage: Build_ARM64 dependsOn: [] - displayName: 'Build ARM64 (Native)' + displayName: 'Build ARM64' pool: name: ${{ variables.arm64PoolName }} demands: ${{ variables.poolDemands }} From eaa27ffc3cc47e386a5e96a8d67767bda98f1a2d Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sat, 18 Jul 2026 07:58:32 -0700 Subject: [PATCH 11/16] Change Build_ARM64EC_Cross to be native, now named Build_ARM64EC. --- azure-pipelines.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 207ade5a0d..1e4c36e44b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -90,20 +90,20 @@ stages: configureTesting: false runTesting: false - - stage: Build_ARM64EC_Cross + - stage: Build_ARM64EC dependsOn: [] - displayName: 'Build ARM64EC (Cross)' + displayName: 'Build ARM64EC' pool: - name: ${{ variables.x64MediumPoolName }} + name: ${{ variables.arm64PoolName }} demands: ${{ variables.poolDemands }} variables: - name: workRoot - value: '$(x64MediumPoolWorkRoot)' + value: '$(arm64PoolWorkRoot)' readonly: true jobs: - template: azure-devops/build-and-test.yml parameters: - hostArch: x64 + hostArch: arm64 targetArch: arm64 targetPlatform: arm64ec analyzeBuild: true From 27792aca0d6dade241ad0f551982633231d79690 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sat, 18 Jul 2026 08:03:14 -0700 Subject: [PATCH 12/16] Change dependencies to actually implement the phase structure. --- azure-pipelines.yml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1e4c36e44b..1979b1b2cd 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -138,8 +138,8 @@ stages: - Code_Format - Build_x64 - Build_x86 - - Build_ARM64_Cross - - Build_ARM64EC_Cross + - Build_ARM64 + - Build_ARM64EC - Configure_Tests displayName: 'Test x64' pool: @@ -158,8 +158,12 @@ stages: - stage: Test_ARM64 dependsOn: - - Build_ARM64_Native - - Test_x64 + - Code_Format + - Build_x64 + - Build_x86 + - Build_ARM64 + - Build_ARM64EC + - Configure_Tests displayName: 'Test ARM64' pool: name: ${{ variables.arm64PoolName }} @@ -177,7 +181,9 @@ stages: ##### Phase 3: Secondary Test Architectures ##### - stage: Test_x86 - dependsOn: Test_x64 + dependsOn: + - Test_x64 + - Test_ARM64 displayName: 'Test x86' pool: name: ${{ variables.x64SlowPoolName }} @@ -195,8 +201,8 @@ stages: - stage: Test_ARM64EC dependsOn: - - Build_ARM64_Native - Test_x64 + - Test_ARM64 displayName: 'Test ARM64EC' pool: name: ${{ variables.arm64PoolName }} From 8843bb4cb3055837fe7e092c5c585710326881d4 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sat, 18 Jul 2026 08:23:39 -0700 Subject: [PATCH 13/16] Adjust VM/pool sizes. Slow pool: 32 VMs, each 64-core. We use 10 VMs in Phase 3 to test x86, so this gives us throughput for 3 PRs. Medium pool: 13 VMs, each 48-core. We use 4 VMs in Phase 1, so this gives us throughput for 3 PRs. (Phase 1 is very fast, so the throughput is really higher.) Fast pool: 21 VMs, each 48-core. We use 10 VMs in Phase 2 to test x64, so this gives us throughput for 2 PRs. ARM64 pool: 32 VMs, each 64-core. We use at most 10 VMs simultaneously (2 in Phase 1, 10 in Phase 2, 10 in Phase 3), so this gives us throughput for 3 PRs. --- azure-devops/create-1es-hosted-pool.ps1 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/azure-devops/create-1es-hosted-pool.ps1 b/azure-devops/create-1es-hosted-pool.ps1 index e2a9f29419..e625922350 100644 --- a/azure-devops/create-1es-hosted-pool.ps1 +++ b/azure-devops/create-1es-hosted-pool.ps1 @@ -33,23 +33,23 @@ $Timestamp = $CurrentDate.ToString('yyyy-MM-ddTHHmm') if ($VMSku -ieq 'Fasv6') { $Arch = 'x64' - $VMSize = 'Standard_F32as_v6' - $PoolSize = 64 # We have quota for 4096 cores (128 VMs), so we can have old and new pools of 64 VMs each. + $VMSize = 'Standard_F64as_v6' + $PoolSize = 32 # We have quota for 4096 cores (64 VMs), so we can have old and new pools of 32 VMs each. $AvailableLocations = @('eastus2') } elseif ($VMSku -ieq 'Fasv7') { $Arch = 'x64' - $VMSize = 'Standard_F32as_v7' - $PoolSize = 20 # Locations where we have quota for at least 640 cores (20 VMs): + $VMSize = 'Standard_F48as_v7' + $PoolSize = 13 # Locations where we have quota for at least 640 cores (13 VMs): $AvailableLocations = @('australiaeast', 'northeurope', 'southeastasia') } elseif ($VMSku -ieq 'Fadsv7') { $Arch = 'x64' - $VMSize = 'Standard_F32ads_v7' - $PoolSize = 32 # We have quota for 2048 cores (64 VMs), so we can have old and new pools of 32 VMs each. + $VMSize = 'Standard_F48ads_v7' + $PoolSize = 21 # We have quota for 2048 cores (42 VMs), so we can have old and new pools of 21 VMs each. $AvailableLocations = @('australiaeast') } elseif ($VMSku -ieq 'Dpdsv6') { $Arch = 'arm64' - $VMSize = 'Standard_D32pds_v6' - $PoolSize = 64 # Locations where we have quota for at least 2048 cores (64 VMs): + $VMSize = 'Standard_D64pds_v6' + $PoolSize = 32 # Locations where we have quota for at least 2048 cores (32 VMs): $AvailableLocations = @('australiaeast', 'southcentralus') } From f613ff1041c3d1014d743ba2ffc88146a59adcaa Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sat, 18 Jul 2026 09:04:43 -0700 Subject: [PATCH 14/16] Split $VMSize into $ProtoVMSize (16-core) and $PoolSkuName (48-core or 64-core). This will make it obvious if resizing works. 16 cores should be plenty for image setup. --- azure-devops/create-1es-hosted-pool.ps1 | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/azure-devops/create-1es-hosted-pool.ps1 b/azure-devops/create-1es-hosted-pool.ps1 index e625922350..389e46399e 100644 --- a/azure-devops/create-1es-hosted-pool.ps1 +++ b/azure-devops/create-1es-hosted-pool.ps1 @@ -33,22 +33,26 @@ $Timestamp = $CurrentDate.ToString('yyyy-MM-ddTHHmm') if ($VMSku -ieq 'Fasv6') { $Arch = 'x64' - $VMSize = 'Standard_F64as_v6' + $ProtoVMSize = 'Standard_F16as_v6' + $PoolSkuName = 'Standard_F64as_v6' $PoolSize = 32 # We have quota for 4096 cores (64 VMs), so we can have old and new pools of 32 VMs each. $AvailableLocations = @('eastus2') } elseif ($VMSku -ieq 'Fasv7') { $Arch = 'x64' - $VMSize = 'Standard_F48as_v7' + $ProtoVMSize = 'Standard_F16as_v7' + $PoolSkuName = 'Standard_F48as_v7' $PoolSize = 13 # Locations where we have quota for at least 640 cores (13 VMs): $AvailableLocations = @('australiaeast', 'northeurope', 'southeastasia') } elseif ($VMSku -ieq 'Fadsv7') { $Arch = 'x64' - $VMSize = 'Standard_F48ads_v7' + $ProtoVMSize = 'Standard_F16ads_v7' + $PoolSkuName = 'Standard_F48ads_v7' $PoolSize = 21 # We have quota for 2048 cores (42 VMs), so we can have old and new pools of 21 VMs each. $AvailableLocations = @('australiaeast') } elseif ($VMSku -ieq 'Dpdsv6') { $Arch = 'arm64' - $VMSize = 'Standard_D64pds_v6' + $ProtoVMSize = 'Standard_D16pds_v6' + $PoolSkuName = 'Standard_D64pds_v6' $PoolSize = 32 # Locations where we have quota for at least 2048 cores (32 VMs): $AvailableLocations = @('australiaeast', 'southcentralus') } @@ -219,13 +223,13 @@ Display-ProgressBar -Status 'Creating prototype VM config' if ($Arch -ieq 'x64') { $VM = New-AzVMConfig ` -VMName $ProtoVMName ` - -VMSize $VMSize ` + -VMSize $ProtoVMSize ` -DiskControllerType 'NVMe' ` -Priority 'Regular' } else { $VM = New-AzVMConfig ` -VMName $ProtoVMName ` - -VMSize $VMSize ` + -VMSize $ProtoVMSize ` -DiskControllerType 'SCSI' ` -Priority 'Regular' ` -SecurityType 'TrustedLaunch' ` @@ -432,7 +436,7 @@ $PoolName = "$ResourceGroupName-Pool" $PoolProperties = @{ 'organization' = 'https://dev.azure.com/vclibs' 'projects' = @('STL') - 'sku' = @{ 'name' = $VMSize; 'tier' = 'StandardSSD'; 'enableSpot' = $false; } + 'sku' = @{ 'name' = $PoolSkuName; 'tier' = 'StandardSSD'; 'enableSpot' = $false; } 'images' = @(@{ 'imageName' = $ImageName; 'poolBufferPercentage' = '100'; }) 'maxPoolSize' = $PoolSize 'agentProfile' = @{ 'type' = 'Stateless'; } From 0f5928485e043c4b798d9c5033fe0fd4c44b3a58 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sun, 19 Jul 2026 06:38:57 -0700 Subject: [PATCH 15/16] Final pools. --- azure-devops/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/azure-devops/config.yml b/azure-devops/config.yml index 910463db16..b32d6469d4 100644 --- a/azure-devops/config.yml +++ b/azure-devops/config.yml @@ -5,16 +5,16 @@ variables: - name: x64SlowPoolName - value: 'Stl-FIXME-x64-Fasv6-Pool' + value: 'Stl-2026-07-18T1628-x64-Fasv6-Pool' readonly: true - name: x64MediumPoolName - value: 'Stl-FIXME-x64-Fasv7-Pool' + value: 'Stl-2026-07-18T1628-x64-Fasv7-Pool' readonly: true - name: x64FastPoolName - value: 'Stl-FIXME-x64-Fadsv7-Pool' + value: 'Stl-2026-07-18T1628-x64-Fadsv7-Pool' readonly: true - name: arm64PoolName - value: 'Stl-FIXME-arm64-Dpdsv6-Pool' + value: 'Stl-2026-07-18T1628-arm64-Dpdsv6-Pool' readonly: true - name: poolDemands value: 'EnableSpotVM -equals false' From 0d137b30bdc7d51bdde5a9be1e4bcbc433a65a4f Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sun, 19 Jul 2026 07:00:20 -0700 Subject: [PATCH 16/16] Add a comment about 16-core embiggening to 48/64-core, and make Notes open-ended. --- azure-devops/create-1es-hosted-pool.ps1 | 26 ++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/azure-devops/create-1es-hosted-pool.ps1 b/azure-devops/create-1es-hosted-pool.ps1 index 389e46399e..445e8f318b 100644 --- a/azure-devops/create-1es-hosted-pool.ps1 +++ b/azure-devops/create-1es-hosted-pool.ps1 @@ -21,15 +21,23 @@ $ErrorActionPreference = 'Stop' $CurrentDate = Get-Date $Timestamp = $CurrentDate.ToString('yyyy-MM-ddTHHmm') -# | SKU | Location | Cores | Notes | -# |--------|----------------|------:|--------------------| -# | Fasv6 | eastus2 | 4096 | | -# | Fasv7 | australiaeast | 740 | | -# | Fasv7 | northeurope | 640 | | -# | Fasv7 | southeastasia | 640 | | -# | Fadsv7 | australiaeast | 2048 | | -# | Dpdsv6 | australiaeast | 2048 | | -# | Dpdsv6 | southcentralus | 2048 | | +# We use 16 cores for the prototype VM ($ProtoVMSize) because we don't need a ton of cores to run provision-image.ps1, +# and this allows us to stay below our total regional vCPU quota when running create-1es-hosted-pool.ps1 for several +# SKUs simultaneously. (Our regional vCPU quota is 100, "enforced across all VM series in a given region" as +# https://learn.microsoft.com/azure/quotas/regional-quota-requests explains. We're creating individual prototype VMs, +# outside of the 1ES Hosted Pools we prepare later, so the prototypes are subject to the limit of 100.) +# As long as everything else matches, we can use the image captured from the prototype VM +# to create a 1ES Hosted Pool with larger VMs ($PoolSkuName) without any issues. + +# | SKU | Location | Cores | Notes +# |--------|----------------|------:|------- +# | Fasv6 | eastus2 | 4096 | +# | Fasv7 | australiaeast | 740 | +# | Fasv7 | northeurope | 640 | +# | Fasv7 | southeastasia | 640 | +# | Fadsv7 | australiaeast | 2048 | +# | Dpdsv6 | australiaeast | 2048 | +# | Dpdsv6 | southcentralus | 2048 | if ($VMSku -ieq 'Fasv6') { $Arch = 'x64'