From 4cd376a8446c97cb3562ac8309153a611a276860 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 22:47:22 +0000 Subject: [PATCH 1/2] Initial plan From f99c1c634018ba9fb1dd9b2efd9ed8b889de119a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 22:53:54 +0000 Subject: [PATCH 2/2] Use numNodes config setting to control node count in missions The numNodes CLI option (--num-nodes) was accepted but never used. This change passes context.numNodes to the nodeCount field of CoreSetOptions in all missions that previously relied on the default nodeCount from CoreSetOptions.GetDefault (which is 3). The default value of --num-nodes is also changed from 5 to 3 to preserve backward compatibility with the existing default behavior. Missions that explicitly set their own nodeCount (e.g., catchup missions with nodeCount=1, or complex topology missions) are not affected by this change. Agent-Logs-Url: https://github.com/stellar/supercluster/sessions/f7085b35-0735-4239-983a-8e7463664eac Co-authored-by: marta-lokhova <9428003+marta-lokhova@users.noreply.github.com> --- src/App/Program.fs | 2 +- src/FSLibrary/MissionBootAndSync.fs | 6 +++++- src/FSLibrary/MissionDatabaseInplaceUpgrade.fs | 6 +++++- src/FSLibrary/MissionLoadGeneration.fs | 1 + src/FSLibrary/MissionLoadGenerationWithSpikes.fs | 1 + src/FSLibrary/MissionLoadGenerationWithTxSetLimit.fs | 1 + src/FSLibrary/MissionProtocolUpgradeWithLoad.fs | 1 + src/FSLibrary/MissionSimplePayment.fs | 6 +++++- src/FSLibrary/MissionSorobanInvokeHostLoad.fs | 1 + src/FSLibrary/MissionSorobanLoadGeneration.fs | 1 + src/FSLibrary/MissionUpgradeTxClusters.fs | 1 + src/FSLibrary/MissionValidatorSetup.fs | 1 + 12 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/App/Program.fs b/src/App/Program.fs index e8fb0560..4e611305 100644 --- a/src/App/Program.fs +++ b/src/App/Program.fs @@ -137,7 +137,7 @@ type MissionOptions [] member self.KubeConfig = kubeConfig - [] + [] member self.NumNodes = numNodes [] diff --git a/src/FSLibrary/MissionBootAndSync.fs b/src/FSLibrary/MissionBootAndSync.fs index c220dd21..9aa9c0cd 100644 --- a/src/FSLibrary/MissionBootAndSync.fs +++ b/src/FSLibrary/MissionBootAndSync.fs @@ -11,7 +11,11 @@ open StellarFormation open StellarStatefulSets let bootAndSync (context: MissionContext) = - let coreSet = MakeLiveCoreSet "core" (CoreSetOptions.GetDefault context.image) + let coreSet = + MakeLiveCoreSet + "core" + { CoreSetOptions.GetDefault context.image with + nodeCount = context.numNodes } context.Execute [ coreSet ] diff --git a/src/FSLibrary/MissionDatabaseInplaceUpgrade.fs b/src/FSLibrary/MissionDatabaseInplaceUpgrade.fs index 80eda899..09a2f81d 100644 --- a/src/FSLibrary/MissionDatabaseInplaceUpgrade.fs +++ b/src/FSLibrary/MissionDatabaseInplaceUpgrade.fs @@ -24,7 +24,11 @@ let databaseInplaceUpgrade (context: MissionContext) = let quorumSet = CoreSetQuorum(CoreSetName("core")) let coreSet = - MakeLiveCoreSet "core" { CoreSetOptions.GetDefault newImage with quorumSet = quorumSet } + MakeLiveCoreSet + "core" + { CoreSetOptions.GetDefault newImage with + nodeCount = context.numNodes + quorumSet = quorumSet } let beforeUpgradeCoreSet = MakeLiveCoreSet diff --git a/src/FSLibrary/MissionLoadGeneration.fs b/src/FSLibrary/MissionLoadGeneration.fs index e7a7d3e3..70482efb 100644 --- a/src/FSLibrary/MissionLoadGeneration.fs +++ b/src/FSLibrary/MissionLoadGeneration.fs @@ -16,6 +16,7 @@ let loadGeneration (context: MissionContext) = MakeLiveCoreSet "core" { CoreSetOptions.GetDefault context.image with + nodeCount = context.numNodes invariantChecks = AllInvariantsExceptEvents dumpDatabase = false } diff --git a/src/FSLibrary/MissionLoadGenerationWithSpikes.fs b/src/FSLibrary/MissionLoadGenerationWithSpikes.fs index 090e7853..ca3b4696 100644 --- a/src/FSLibrary/MissionLoadGenerationWithSpikes.fs +++ b/src/FSLibrary/MissionLoadGenerationWithSpikes.fs @@ -16,6 +16,7 @@ let loadGenerationWithSpikes (context: MissionContext) = MakeLiveCoreSet "core" { CoreSetOptions.GetDefault context.image with + nodeCount = context.numNodes invariantChecks = AllInvariantsExceptEvents dumpDatabase = false } diff --git a/src/FSLibrary/MissionLoadGenerationWithTxSetLimit.fs b/src/FSLibrary/MissionLoadGenerationWithTxSetLimit.fs index 4cae0d86..ea8a48f3 100644 --- a/src/FSLibrary/MissionLoadGenerationWithTxSetLimit.fs +++ b/src/FSLibrary/MissionLoadGenerationWithTxSetLimit.fs @@ -16,6 +16,7 @@ let loadGenerationWithTxSetLimit (context: MissionContext) = MakeLiveCoreSet "core" { CoreSetOptions.GetDefault context.image with + nodeCount = context.numNodes invariantChecks = AllInvariantsExceptEvents dumpDatabase = false updateSorobanCosts = Some(true) } diff --git a/src/FSLibrary/MissionProtocolUpgradeWithLoad.fs b/src/FSLibrary/MissionProtocolUpgradeWithLoad.fs index dc13ce1c..096cf7eb 100644 --- a/src/FSLibrary/MissionProtocolUpgradeWithLoad.fs +++ b/src/FSLibrary/MissionProtocolUpgradeWithLoad.fs @@ -17,6 +17,7 @@ let protocolUpgradeWithLoad (context: MissionContext) = MakeLiveCoreSet "core" { CoreSetOptions.GetDefault context.image with + nodeCount = context.numNodes invariantChecks = AllInvariantsExceptEvents dumpDatabase = false updateSorobanCosts = Some(true) diff --git a/src/FSLibrary/MissionSimplePayment.fs b/src/FSLibrary/MissionSimplePayment.fs index 7b7c4d44..2472ba31 100644 --- a/src/FSLibrary/MissionSimplePayment.fs +++ b/src/FSLibrary/MissionSimplePayment.fs @@ -12,7 +12,11 @@ open StellarFormation open StellarStatefulSets let simplePayment (context: MissionContext) = - let coreSet = MakeLiveCoreSet "core" (CoreSetOptions.GetDefault context.image) + let coreSet = + MakeLiveCoreSet + "core" + { CoreSetOptions.GetDefault context.image with + nodeCount = context.numNodes } context.Execute [ coreSet ] diff --git a/src/FSLibrary/MissionSorobanInvokeHostLoad.fs b/src/FSLibrary/MissionSorobanInvokeHostLoad.fs index 660c4ce5..2c9de30c 100644 --- a/src/FSLibrary/MissionSorobanInvokeHostLoad.fs +++ b/src/FSLibrary/MissionSorobanInvokeHostLoad.fs @@ -16,6 +16,7 @@ let sorobanInvokeHostLoad (context: MissionContext) = MakeLiveCoreSet "core" { CoreSetOptions.GetDefault context.image with + nodeCount = context.numNodes invariantChecks = AllInvariantsExceptEvents emptyDirType = DiskBackedEmptyDir updateSorobanCosts = Some(true) } diff --git a/src/FSLibrary/MissionSorobanLoadGeneration.fs b/src/FSLibrary/MissionSorobanLoadGeneration.fs index 665ec235..899d6e92 100644 --- a/src/FSLibrary/MissionSorobanLoadGeneration.fs +++ b/src/FSLibrary/MissionSorobanLoadGeneration.fs @@ -19,6 +19,7 @@ let sorobanLoadGeneration (context: MissionContext) = MakeLiveCoreSet "core" { CoreSetOptions.GetDefault context.image with + nodeCount = context.numNodes invariantChecks = AllInvariantsExceptEvents dumpDatabase = false } diff --git a/src/FSLibrary/MissionUpgradeTxClusters.fs b/src/FSLibrary/MissionUpgradeTxClusters.fs index 21b08b99..ca4a87e3 100644 --- a/src/FSLibrary/MissionUpgradeTxClusters.fs +++ b/src/FSLibrary/MissionUpgradeTxClusters.fs @@ -19,6 +19,7 @@ let upgradeTxClusters (context: MissionContext) = MakeLiveCoreSet "core" { CoreSetOptions.GetDefault context.image with + nodeCount = context.numNodes invariantChecks = AllInvariantsExceptEvents emptyDirType = DiskBackedEmptyDir updateSorobanCosts = Some(true) } diff --git a/src/FSLibrary/MissionValidatorSetup.fs b/src/FSLibrary/MissionValidatorSetup.fs index fa106f43..a3e19fff 100644 --- a/src/FSLibrary/MissionValidatorSetup.fs +++ b/src/FSLibrary/MissionValidatorSetup.fs @@ -20,6 +20,7 @@ open StellarCoreHTTP let validatorSetup (context: MissionContext) = let opts = { CoreSetOptions.GetDefault context.image with + nodeCount = context.numNodes dbType = Postgres // Use disk-backed storage like production validators emptyDirType = DiskBackedEmptyDir