Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/App/Program.fs
Original file line number Diff line number Diff line change
Expand Up @@ -524,7 +524,7 @@ type MissionOptions
[<Option("enable-relaxed-auto-qset-config",
HelpText = "Enables the use of automatic quorum set configuration on missions that may create core sets that do not satisfy the redundancy and history requirements placed on pubnet validators. Requires a stellar-core version that supports the SKIP_HIGH_CRITICAL_VALIDATOR_CHECKS_FOR_TESTING config option.",
Copy link

Copilot AI Apr 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With this option now defaulting to true, the help text reads like it is an opt-in flag. Consider amending the HelpText to explicitly state that it defaults to enabled and that users can opt out by passing --enable-relaxed-auto-qset-config=false (important if someone needs to run against an older stellar-core image that doesn’t support the config key).

Suggested change
HelpText = "Enables the use of automatic quorum set configuration on missions that may create core sets that do not satisfy the redundancy and history requirements placed on pubnet validators. Requires a stellar-core version that supports the SKIP_HIGH_CRITICAL_VALIDATOR_CHECKS_FOR_TESTING config option.",
HelpText = "Enabled by default. Uses automatic quorum set configuration on missions that may create core sets that do not satisfy the redundancy and history requirements placed on pubnet validators. Opt out with --enable-relaxed-auto-qset-config=false, which may be necessary when running against older stellar-core images that do not support the SKIP_HIGH_CRITICAL_VALIDATOR_CHECKS_FOR_TESTING config option.",

Copilot uses AI. Check for mistakes.
Required = false,
Default = false)>]
Default = true)>]
member self.EnableRelaxedAutoQsetConfig = enableRelaxedAutoQsetConfig

[<Option("job-monitor-external-host",
Expand Down Expand Up @@ -727,7 +727,7 @@ let main argv =
catchupSkipKnownResultsForTesting = None
checkEventsAreConsistentWithEntryDiffs = None
updateSorobanCosts = None
enableRelaxedAutoQsetConfig = false
enableRelaxedAutoQsetConfig = true
jobMonitorExternalHost = None
txBatchMaxSize = None
runForMaxTps = None
Expand Down
2 changes: 1 addition & 1 deletion src/FSLibrary.Tests/Tests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ let ctx : MissionContext =
updateSorobanCosts = None
genesisTestAccountCount = None
asanOptions = None
enableRelaxedAutoQsetConfig = false
enableRelaxedAutoQsetConfig = true
jobMonitorExternalHost = None
txBatchMaxSize = None
runForMaxTps = None
Expand Down
18 changes: 3 additions & 15 deletions src/FSLibrary/MissionCatchupHelpers.fs
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,7 @@ let MakeCatchupSets (options: CatchupMissionOptions) =
{ CoreSetOptions.GetDefault options.generatorImage with
nodeCount = 1
quorumSet = CoreSetQuorum(CoreSetName "generator")
accelerateTime = true
// FIXME: Remove these options once the stable (old) image in
// CI supports skipping validator quality checks
skipHighCriticalValidatorChecks = false
quorumSetConfigType = RequireExplicitQset }
accelerateTime = true }


let generatorSet = MakeLiveCoreSet "generator" generatorOptions
Expand All @@ -74,11 +70,7 @@ let MakeCatchupSets (options: CatchupMissionOptions) =
nodeCount = 1
quorumSet = CoreSetQuorum(CoreSetName "generator")
accelerateTime = true
initialization = CoreSetInitialization.DefaultNoForceSCP
// FIXME: Remove these options once the stable (old) image in
// CI supports skipping validator quality checks
skipHighCriticalValidatorChecks = false
quorumSetConfigType = RequireExplicitQset }
initialization = CoreSetInitialization.DefaultNoForceSCP }

let minimal1Options = { newNodeOptions with catchupMode = CatchupRecent(0) }
let minimal1Set = MakeDeferredCoreSet "minimal1" minimal1Options
Expand Down Expand Up @@ -133,11 +125,7 @@ let MakeCatchupSets (options: CatchupMissionOptions) =
{ CoreSetOptions.GetDefault options.versionImage with
nodeCount = 1
quorumSet = CoreSetQuorum(CoreSetName "version")
accelerateTime = true
// FIXME: Remove these options once the stable (old) image in
// CI supports skipping validator quality checks
skipHighCriticalValidatorChecks = false
quorumSetConfigType = RequireExplicitQset }
accelerateTime = true }

let versionSet = MakeLiveCoreSet "version" versionOptions

Expand Down
6 changes: 1 addition & 5 deletions src/FSLibrary/MissionDatabaseInplaceUpgrade.fs
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,7 @@ let databaseInplaceUpgrade (context: MissionContext) =
"before-upgrade"
{ CoreSetOptions.GetDefault oldImage with
nodeCount = 1
quorumSet = quorumSet
// FIXME: Remove these options once the stable (old) image in
// CI supports skipping validator quality checks
skipHighCriticalValidatorChecks = false
quorumSetConfigType = RequireExplicitQset }
quorumSet = quorumSet }

let fetchFromPeer = Some(CoreSetName("before-upgrade"), 0)

Expand Down
6 changes: 1 addition & 5 deletions src/FSLibrary/MissionMixedImageLoadGeneration.fs
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,7 @@ let mixedImageLoadGeneration (oldImageNodeCount: int) (context: MissionContext)
invariantChecks = AllInvariantsExceptEvents
accelerateTime = false
dumpDatabase = false
quorumSet = qSet
// FIXME: Remove these options once the stable (old) image in
// CI supports skipping validator quality checks
skipHighCriticalValidatorChecks = false
quorumSetConfigType = RequireExplicitQset }
quorumSet = qSet }

let newCoreSet =
MakeLiveCoreSet
Expand Down
6 changes: 1 addition & 5 deletions src/FSLibrary/MissionMixedImageNetworkSurvey.fs
Original file line number Diff line number Diff line change
Expand Up @@ -119,11 +119,7 @@ let mixedImageNetworkSurvey (context: MissionContext) =
{ CoreSetOptions.GetDefault oldImage with
nodeCount = oldKeys.Length
accelerateTime = false
surveyPhaseDuration = Some surveyPhaseDurationMinutes
// FIXME: Remove these options once the stable (old) image
// in CI supports skipping validator quality checks
skipHighCriticalValidatorChecks = false
quorumSetConfigType = RequireExplicitQset } }
surveyPhaseDuration = Some surveyPhaseDurationMinutes } }

let newCoreSet =
{ name = CoreSetName newName
Expand Down
11 changes: 1 addition & 10 deletions src/FSLibrary/MissionVersionMixConsensus.fs
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,7 @@ let versionMixConsensus (context: MissionContext) =
"before"
{ CoreSetOptions.GetDefault oldImage with
nodeCount = 2
quorumSet = CoreSetQuorum(CoreSetName "before")
// FIXME: Remove these options once the stable (old) image in
// CI supports skipping validator quality checks
skipHighCriticalValidatorChecks = false
quorumSetConfigType = RequireExplicitQset }
quorumSet = CoreSetQuorum(CoreSetName "before") }

let fetchFromPeer = Some(CoreSetName("before"), 0)

Expand All @@ -42,7 +38,6 @@ let versionMixConsensus (context: MissionContext) =
nodeCount = 2
historyNodes = Some([])
quorumSet = CoreSetQuorumListWithThreshold([ CoreSetName "new-core"; CoreSetName "old-core" ], 100)
quorumSetConfigType = RequireExplicitQset
initialization =
{ newDb = true
newHist = true
Expand All @@ -58,10 +53,6 @@ let versionMixConsensus (context: MissionContext) =
nodeCount = 2
historyNodes = Some([])
quorumSet = CoreSetQuorumListWithThreshold([ CoreSetName "new-core"; CoreSetName "old-core" ], 100)
// FIXME: Remove these options once the stable (old) image in
// CI supports skipping validator quality checks
skipHighCriticalValidatorChecks = false
quorumSetConfigType = RequireExplicitQset
initialization =
{ newDb = true
newHist = true
Expand Down
16 changes: 7 additions & 9 deletions src/FSLibrary/StellarCoreSet.fs
Original file line number Diff line number Diff line change
Expand Up @@ -177,14 +177,12 @@ type InvariantChecksSpec =
// Determines how quorum set configurations should be generated
type QuorumSetConfiguration =
// Prefer automatic quorum set configuration. Fall back on explicit quorum
// set configuration if automatic configuration is not possible, or if
// --enable-relaxed-auto-qset-config is not set.
// set configuration if automatic configuration is not possible.
Comment on lines 179 to +180
Copy link

Copilot AI Apr 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PreferAutoQset comment says it falls back to explicit quorum only when automatic configuration is not possible, but the implementation also forces an explicit quorum when missionContext.enableRelaxedAutoQsetConfig is false (see NetworkCfg.QuorumSet in StellarCoreCfg.fs). Consider updating the comment to reflect that PreferAutoQset only uses auto-qset when relaxed auto-qset is enabled (or otherwise clarify the meaning of “not possible”).

Copilot uses AI. Check for mistakes.
| PreferAutoQset
// Require automatic quorum set configuration. Fail if automatic
// configuration is not possible. Uses automatic configuration even if
// --enable-relaxed-auto-qset-config is not set, so missions using this
// option *must* satisfy the HIGH quality validator checks present in
// stellar-core.
// configuration is not possible. Missions using this option *must* satisfy
// the HIGH quality validator checks present in stellar-core, or set
// `skipHighCriticalValidatorChecks` to `true`.
Comment on lines 182 to +185
Copy link

Copilot AI Apr 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment suggests setting skipHighCriticalValidatorChecks is sufficient to bypass the HIGH/CRITICAL validator checks, but the config key is only emitted when missionContext.enableRelaxedAutoQsetConfig is also true (see StellarCoreCfg.fs where SKIP_HIGH_CRITICAL_VALIDATOR_CHECKS_FOR_TESTING is gated). Please clarify this requirement here to avoid misleading mission authors.

Copilot uses AI. Check for mistakes.
| RequireAutoQset
// Require explicit quorum set configuration.
| RequireExplicitQset
Expand Down Expand Up @@ -222,9 +220,9 @@ type CoreSetOptions =
addArtificialDelayUsec: int option
surveyPhaseDuration: int option
updateSorobanCosts: bool option
// `skipHighCriticalValidatorChecks` exists to allow supercluster to
// remain compatible with older stellar-core images that do not have the
// ability to turn of validator checks for HIGH and CRITICAL validators
// `skipHighCriticalValidatorChecks` controls whether to set
// SKIP_HIGH_CRITICAL_VALIDATOR_CHECKS_FOR_TESTING in stellar-core config,
// which disables validator checks for HIGH and CRITICAL validators.
Comment on lines +224 to +225
Copy link

Copilot AI Apr 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

skipHighCriticalValidatorChecks is described as controlling whether SKIP_HIGH_CRITICAL_VALIDATOR_CHECKS_FOR_TESTING is set, but in the config generation it is additionally gated on missionContext.enableRelaxedAutoQsetConfig. Consider mentioning that this only takes effect when relaxed auto-qset config is enabled, so the field name/comment match runtime behavior.

Suggested change
// SKIP_HIGH_CRITICAL_VALIDATOR_CHECKS_FOR_TESTING in stellar-core config,
// which disables validator checks for HIGH and CRITICAL validators.
// SKIP_HIGH_CRITICAL_VALIDATOR_CHECKS_FOR_TESTING in stellar-core config
// when relaxed auto-qset config is enabled, which disables validator
// checks for HIGH and CRITICAL validators.

Copilot uses AI. Check for mistakes.
skipHighCriticalValidatorChecks: bool }

member self.WithWaitForConsensus(w: bool) =
Expand Down
Loading