Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
194 commits
Select commit Hold shift + click to select a range
b9a1fa9
Update Narya to latest Zen 5 verification optimizations
7layermagik Sep 12, 2026
9803f16
Overlap Turbine signature verification with shred arrival
7layermagik Sep 12, 2026
9a85ada
Document Zen 5 streaming verification and execution contention results
7layermagik Sep 12, 2026
a8aff5a
Avoid rebuilding cached shred component buffers at completion
7layermagik Sep 12, 2026
9265ee9
Reduce completion ordering and root work; bundle ready verification g…
7layermagik Sep 13, 2026
f184535
Make streaming tests independent of FEC acceleration
7layermagik Sep 13, 2026
0063cfb
Allocate each prepared component transaction view once
7layermagik Sep 13, 2026
7c5bcc3
Document standalone streaming validation and live trial scope
7layermagik Sep 13, 2026
d0cf70b
Avoid redundant shred retention sweeps at an unchanged frontier
7layermagik Sep 14, 2026
331ce3f
Document retention benchmark and post-deployment FAST measurements
7layermagik Sep 14, 2026
314c48c
Prepare transaction message identities during shred arrival
7layermagik Sep 14, 2026
addabea
Record native deployment and initial live identity timing results
7layermagik Sep 14, 2026
2e0824b
Discover independent complete batches and preserve bounded prefetch r…
7layermagik Sep 15, 2026
7593722
Document isolated PR validation and retain relevant benchmark evidence
7layermagik Sep 15, 2026
ef927bd
Normalize benchmark document formatting
7layermagik Sep 15, 2026
7934bac
Recover safely from inconsistent entry identities and own streaming c…
7layermagik Sep 15, 2026
406317b
Reuse relay peer scratch and packet storage with explicit ownership
7layermagik Sep 15, 2026
d5c44ec
turbine: reserve verifier admission for completion
7layermagik Sep 15, 2026
be807ff
review: clarify ownership and archive investigation artifacts
7layermagik Sep 16, 2026
33efc88
docs: keep review specifications and archive operational notes
7layermagik Sep 16, 2026
fd829f6
Advance replay progress without waiting for certificate verification
7layermagik Sep 14, 2026
ad2cd47
Cache observer statistics until certificate or replay inputs change
7layermagik Sep 15, 2026
343a661
Verify certificates outside the pool mutex and reuse verified BLS points
7layermagik Sep 15, 2026
5133813
Document isolated PR validation and retain relevant benchmark evidence
7layermagik Sep 15, 2026
45fcf66
Use bounded multi-scalar aggregation for larger vote batches
7layermagik Sep 15, 2026
623dcfd
Preserve scalar verification on single-thread runtimes
7layermagik Sep 15, 2026
4927628
alpenglow: reconcile only pending observer certificates during replay
7layermagik Sep 15, 2026
efcb294
review: clarify ownership and archive investigation artifacts
7layermagik Sep 16, 2026
f253465
docs: validate archive links and formatting
7layermagik Sep 16, 2026
3f074ed
alpenglow: prioritize reward flushes and reuse vote dedupe keys
7layermagik Sep 16, 2026
5ca27a9
turbine: integrate two-FEC components, generation, and recovery atomi…
7layermagik Sep 16, 2026
039ebd6
blockprod: report entry transaction serialization failures
7layermagik Sep 16, 2026
9db7dcb
Integrate reviewed validator performance changes for combined testing
7layermagik Sep 16, 2026
28e3238
Move transaction-status checkpoint encoding off the replay loop
7layermagik Sep 14, 2026
f1a15c2
Expire transaction-status groups in batches on durable promotion
7layermagik Sep 14, 2026
852aae9
Record native Zen 5 expiry benchmark results
7layermagik Sep 14, 2026
6e52789
Document isolated PR validation and retain relevant benchmark evidence
7layermagik Sep 15, 2026
6c31ff5
Prepare transaction-status deltas during block execution
7layermagik Sep 15, 2026
c241d6b
Include raw status-publication benchmark and validation logs
7layermagik Sep 15, 2026
fe54faa
Reuse immutable node encodings across status checkpoints
7layermagik Sep 15, 2026
f9f2f64
Document native checkpoint encoding measurements
7layermagik Sep 15, 2026
b8a3aed
replay: preflight fold batch eligibility before copying account writes
7layermagik Sep 15, 2026
3f97e9c
replay: retire completed rewards bookkeeping after durable promotion
7layermagik Sep 15, 2026
cb34ddc
replay: reuse ancestor validation for unchanged status cache
7layermagik Sep 15, 2026
c1f864f
replay: partition large transaction status index updates
7layermagik Sep 15, 2026
b8df19d
review: defer status-map partitioning and archive investigation artif…
7layermagik Sep 16, 2026
f164274
docs: keep review specifications and archive operational notes
7layermagik Sep 16, 2026
ced869c
docs: validate archive links and formatting
7layermagik Sep 16, 2026
939aa26
replay: rebind disappeared status groups and randomize encoding checks
7layermagik Sep 16, 2026
065ee9e
replay: rebind disappeared status groups and randomize encoding checks
7layermagik Sep 16, 2026
9112978
turbine: authenticate recovered shreds against the signed FEC tree
7layermagik Sep 16, 2026
b006f95
Improve leader packing and add near-limit synthetic block tests
7layermagik Sep 13, 2026
828e001
Document current-base leader benchmarks and finalized load results
7layermagik Sep 13, 2026
ea5a182
Bound scheduler transaction references in both priority heaps
7layermagik Sep 14, 2026
185673d
Document scheduler retention tradeoffs and near-limit block results
7layermagik Sep 15, 2026
5925338
turbine: authenticate recovered shreds against the signed FEC tree
7layermagik Sep 16, 2026
72a3b51
turbine: queue spool completion hints outside block delivery
7layermagik Sep 15, 2026
cfb00cd
Document isolated PR validation and retain relevant benchmark evidence
7layermagik Sep 15, 2026
273d580
docs: record spool deployment results and remaining verification tails
7layermagik Sep 15, 2026
a22ccd5
docs: keep review specifications and archive operational notes
7layermagik Sep 16, 2026
c35485c
docs: keep spool recovery contract and archive operational notes
7layermagik Sep 16, 2026
bcc4725
docs: validate archive links and formatting
7layermagik Sep 16, 2026
bd396ec
docs: validate archive links and formatting
7layermagik Sep 16, 2026
3937072
test: use public component serialization in leader round trip
7layermagik Sep 16, 2026
25a8b69
leader: precheck buffer admission before transaction preparation
7layermagik Sep 16, 2026
f2acfb4
turbine: warn when completion fencing prevents spool deletion
7layermagik Sep 16, 2026
c757ea8
turbine: warn when completion fencing prevents spool deletion
7layermagik Sep 16, 2026
5ef7a22
leader: precheck buffer admission before transaction preparation
7layermagik Sep 16, 2026
b552ee9
sbpf: reject overflow in contiguous virtual memory ranges
7layermagik Sep 16, 2026
ace6e26
sealevel: remove SHA-256 syscall descriptor and digest allocations
7layermagik Sep 16, 2026
d855141
test: measure captured SHA loop and document Zen 5 acceleration
7layermagik Sep 16, 2026
ef418c7
sbpf: cut per-instruction overhead in the interpreter (~2x on SPL Tok…
claude Sep 16, 2026
b9e723a
sbpf: add interpreter benchmarks and a differential test corpus
claude Sep 16, 2026
be48dcc
sealevel: add native program micro-benchmarks (System transfer, Vote …
claude Sep 16, 2026
9589709
test: update VASA stack registers for fixed-size interpreter state
7layermagik Sep 16, 2026
ee5234b
test: benchmark verified token arithmetic and CPI workloads with warm…
7layermagik Sep 16, 2026
1ca6112
docs: record individual-program and matched Alpenglow replay measurem…
7layermagik Sep 16, 2026
cbef964
sealevel: copy, compare and fill VM memory without temporaries or byt…
claude Sep 16, 2026
ff5b10a
lthash: vectorize MixIn/MixOut with AVX2 on amd64
claude Sep 16, 2026
6c2490e
test: preserve zero-length memory validation and repair VM fixtures
7layermagik Sep 16, 2026
8764903
test: cover unaligned and aliased AVX2 hash lanes
7layermagik Sep 16, 2026
b03afad
sbpf: account for resolved call targets in program cache cost
7layermagik Sep 16, 2026
e53c1f3
test: retain syscall differential coverage and execution reproduction…
7layermagik Sep 16, 2026
05ca7ae
test: trim execution benchmark experiments and documentation
7layermagik Sep 16, 2026
8cdb0cf
replay: record FullToReplayed, the vote-path latency replay controls
claude Sep 16, 2026
411e8b0
replay: make block execution resumable (open / execute group / finalize)
claude Sep 16, 2026
400dc65
turbine: streaming feed of decoded batches for replay
claude Sep 16, 2026
ad9f734
sealevel/replay: let a speculative bank defer its process-global side…
claude Sep 16, 2026
607724b
replay: streaming execution of turbine blocks while their shreds arrive
claude Sep 16, 2026
1467778
replay: keep every transaction of the group-equivalence fixture proce…
claude Sep 16, 2026
580d529
turbine: stream feed test verifies with the identity-producing verifier
claude Sep 16, 2026
b85caf9
replay: streaming finalize keeps ownership of its bank until the tail…
claude Sep 16, 2026
ad50511
replay: lifecycle equivalence test — streamed bank equals whole-block…
claude Sep 16, 2026
88373b1
block: PreparedTransactionMessageIdentities.Rebind for stream-owned c…
claude Sep 16, 2026
a64efd6
replay: streams execute their own transaction copies; block objects s…
claude Sep 16, 2026
1347b87
block: make execution copies and their identities one operation
claude Sep 16, 2026
ebc5806
turbine/replay: real-feed lifecycle gate; recover a dropped header wa…
claude Sep 16, 2026
bc4ac81
replay: stream direct children across unresolved slot gaps
7layermagik Sep 16, 2026
188b903
turbine: wake repair promptly for new priority slots
7layermagik Sep 16, 2026
7a2386d
replay: streaming open timeline — what held a child's stream, and why…
claude Sep 16, 2026
cb63e0c
replay: streaming per-group record — verifier waits, execution after …
claude Sep 16, 2026
b87bd57
replay: correct streaming timing attribution
7layermagik Sep 16, 2026
cfbdec7
replay: refresh ready batches before streaming group dispatch
7layermagik Sep 16, 2026
d0f8237
replay: retain account loader metrics across streaming groups
7layermagik Sep 16, 2026
61aaeaa
turbine: trace completion-critical shred sources and repair sends
7layermagik Sep 16, 2026
320ce8d
turbine: prioritize the earliest repair gap for streaming heads
7layermagik Sep 17, 2026
1f755c8
turbine: trace repair response matching and FEC progress
7layermagik Sep 17, 2026
72757aa
turbine: repair one child prefix while its parent executes
7layermagik Sep 17, 2026
3e22d98
turbine: select highest-shred followups after admission
7layermagik Sep 17, 2026
1ec9861
turbine: test spool followups and benchmark fragmented selection
7layermagik Sep 17, 2026
eb17bbf
sbpf: restore v2 memory opcodes and differential coverage
7layermagik Sep 20, 2026
9df40ca
turbine: release prefetch reservations after failed completion
7layermagik Sep 20, 2026
76a03c2
blockprod: validate transaction serialization before bank execution
7layermagik Sep 20, 2026
8082fec
turbine: bound stream notification lifetimes and retry prefetch
7layermagik Sep 20, 2026
022fb83
sbpf: guard pooled write tracking beyond bitmap capacity
7layermagik Sep 20, 2026
be007c3
replay: bound speculative signature verification waits
7layermagik Sep 20, 2026
2678206
sealevel: match Agave zero-length memory copy behavior
7layermagik Sep 20, 2026
f526c1d
review: close remaining resource, diagnostics and regression gaps
7layermagik Sep 20, 2026
747d314
Merge current alpenglow-dev emission and rewind fixes
7layermagik Sep 20, 2026
e7d351a
test: synchronize completion cancellation on the owning join
7layermagik Sep 20, 2026
7fcdcbb
sealevel: correct return-data truncation and ABI encodings
7layermagik Sep 20, 2026
25447e3
test: repair legacy bank fixtures and run full sealevel CI
7layermagik Sep 20, 2026
02da533
test: compare streaming replay across program and account mutations
7layermagik Sep 20, 2026
26a6a81
sealevel: track sibling header writes in pooled VM memory
7layermagik Sep 20, 2026
8238acd
replay: preserve independent banks and pending fork switches
7layermagik Sep 20, 2026
868524b
turbine: cancel completed streams when delivery is abandoned
7layermagik Sep 20, 2026
bcfc012
replay: remove obsolete streaming missing-fee panic
7layermagik Sep 20, 2026
1b7da56
turbine: prioritize older pinned repair dependencies
7layermagik Sep 20, 2026
16e4c8e
turbine: reuse immutable ready stream views
7layermagik Sep 20, 2026
be29319
sealevel: bind cached executables to bank-visible source and features
7layermagik Sep 20, 2026
fda34f6
rewards: preserve credits on inactive Alpenglow stakes
smcio Sep 22, 2026
2d0ea6f
replay: checkpoint reward windows only after verified completion
smcio Sep 22, 2026
c1f7134
docs: remove epoch 116 incident report
smcio Sep 22, 2026
74d110c
Merge remote-tracking branch 'origin/alpenglow-dev' into 7layer/pr-ce…
7layermagik Sep 24, 2026
3973850
Fix Alpenglow Votor certificate compatibility with Firedancer
7layermagik Sep 13, 2026
680cb47
Merge remote-tracking branch 'origin/alpenglow-dev' into 7layer/pr-tu…
7layermagik Sep 24, 2026
008258f
rewards: preserve credits on inactive Alpenglow stakes
smcio Sep 22, 2026
5bfcdd6
replay: retire completed rewards bookkeeping after durable promotion
7layermagik Sep 15, 2026
35d73a7
replay: checkpoint reward windows only after verified completion
smcio Sep 22, 2026
0a86a01
alpenglow: isolate bounded peer delivery from vote persistence
7layermagik Sep 24, 2026
0fe2fc1
docs: remove epoch 116 incident report
smcio Sep 22, 2026
1e52065
Merge branch '7layer/pr-turbine-ingestion' into 7layer/pr-leader-packing
7layermagik Sep 24, 2026
72f6a69
Merge independent epoch-recovery correctness prerequisite
7layermagik Sep 24, 2026
318ddb2
alpenglow: separate opt-in signing reservations and ordered history p…
7layermagik Sep 24, 2026
4166afa
Merge branch '7layer/pr-certificate-delivery' into 7layer/review-perf…
7layermagik Sep 24, 2026
bdada66
Merge branch '7layer/pr-vote-persistence' into 7layer/review-performa…
7layermagik Sep 24, 2026
eaf4c41
Integrate leader packing with opt-in voting persistence
7layermagik Sep 24, 2026
2170cd3
Integrate replay checkpoints and epoch correctness
7layermagik Sep 24, 2026
fd4ae2f
fix: preserve boolean flag defaults and explicit config overrides
7layermagik Sep 16, 2026
c7d9f6c
fix: own retained vote deque storage before pooled reuse
7layermagik Sep 16, 2026
8a424ba
sbpf: reject overflow in contiguous virtual memory ranges
7layermagik Sep 16, 2026
c12362b
sealevel: remove SHA-256 syscall descriptor and digest allocations
7layermagik Sep 16, 2026
bb23409
test: measure captured SHA loop and document Zen 5 acceleration
7layermagik Sep 16, 2026
de8ea09
sbpf: cut per-instruction overhead in the interpreter (~2x on SPL Tok…
claude Sep 16, 2026
faa0cb0
sbpf: add interpreter benchmarks and a differential test corpus
claude Sep 16, 2026
daf2acf
sealevel: add native program micro-benchmarks (System transfer, Vote …
claude Sep 16, 2026
929471b
test: update VASA stack registers for fixed-size interpreter state
7layermagik Sep 16, 2026
3d31a10
test: benchmark verified token arithmetic and CPI workloads with warm…
7layermagik Sep 16, 2026
8401d57
docs: record individual-program and matched Alpenglow replay measurem…
7layermagik Sep 16, 2026
d8fd064
sealevel: copy, compare and fill VM memory without temporaries or byt…
claude Sep 16, 2026
7c8cfa3
lthash: vectorize MixIn/MixOut with AVX2 on amd64
claude Sep 16, 2026
928f920
test: preserve zero-length memory validation and repair VM fixtures
7layermagik Sep 16, 2026
fdbc019
test: cover unaligned and aliased AVX2 hash lanes
7layermagik Sep 16, 2026
5c7a83a
sbpf: account for resolved call targets in program cache cost
7layermagik Sep 16, 2026
ad31b3d
test: retain syscall differential coverage and execution reproduction…
7layermagik Sep 16, 2026
1ac8878
test: trim execution benchmark experiments and documentation
7layermagik Sep 16, 2026
23a67db
sbpf: restore v2 memory opcodes and differential coverage
7layermagik Sep 20, 2026
b182b33
sbpf: guard pooled write tracking beyond bitmap capacity
7layermagik Sep 20, 2026
9585fa4
sealevel: match Agave zero-length memory copy behavior
7layermagik Sep 20, 2026
52a1aad
sealevel: track sibling header writes in pooled VM memory
7layermagik Sep 20, 2026
4df8387
Reconcile streaming with regrouped performance prerequisites
7layermagik Sep 24, 2026
915f619
fix: preserve boolean flag defaults and explicit config overrides
7layermagik Sep 16, 2026
cb360c4
fix: own retained vote deque storage before pooled reuse
7layermagik Sep 16, 2026
be7a914
sbpf: reject overflow in contiguous virtual memory ranges
7layermagik Sep 16, 2026
584791f
sealevel: remove SHA-256 syscall descriptor and digest allocations
7layermagik Sep 16, 2026
f944a0e
test: measure captured SHA loop and document Zen 5 acceleration
7layermagik Sep 16, 2026
75db2e0
sbpf: cut per-instruction overhead in the interpreter (~2x on SPL Tok…
claude Sep 16, 2026
5b8f33f
sbpf: add interpreter benchmarks and a differential test corpus
claude Sep 16, 2026
3f0ec6c
sealevel: add native program micro-benchmarks (System transfer, Vote …
claude Sep 16, 2026
e8dcadc
test: update VASA stack registers for fixed-size interpreter state
7layermagik Sep 16, 2026
203e105
test: benchmark verified token arithmetic and CPI workloads with warm…
7layermagik Sep 16, 2026
1f4a69b
docs: record individual-program and matched Alpenglow replay measurem…
7layermagik Sep 16, 2026
2361bc9
sealevel: copy, compare and fill VM memory without temporaries or byt…
claude Sep 16, 2026
32e149e
lthash: vectorize MixIn/MixOut with AVX2 on amd64
claude Sep 16, 2026
bfddc29
test: preserve zero-length memory validation and repair VM fixtures
7layermagik Sep 16, 2026
4ad9805
test: cover unaligned and aliased AVX2 hash lanes
7layermagik Sep 16, 2026
1ca0fb3
sbpf: account for resolved call targets in program cache cost
7layermagik Sep 16, 2026
a6f3586
test: retain syscall differential coverage and execution reproduction…
7layermagik Sep 16, 2026
14c5404
test: trim execution benchmark experiments and documentation
7layermagik Sep 16, 2026
1992ab4
sbpf: restore v2 memory opcodes and differential coverage
7layermagik Sep 20, 2026
a520264
sbpf: guard pooled write tracking beyond bitmap capacity
7layermagik Sep 20, 2026
3830a18
sealevel: match Agave zero-length memory copy behavior
7layermagik Sep 20, 2026
a317eb6
sealevel: track sibling header writes in pooled VM memory
7layermagik Sep 20, 2026
1762cf1
Group replay checkpoints, epoch recovery and streaming over execution
7layermagik Sep 24, 2026
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
30 changes: 30 additions & 0 deletions .github/workflows/go_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,33 @@ jobs:

- name: Build
run: go build -v ./cmd/mithril

regression-tests:
runs-on: ubuntu-latest
timeout-minutes: 20
permissions:
contents: read
env:
GOMAXPROCS: "2"
steps:
- uses: actions/checkout@v3

- name: Setup Go
uses: actions/setup-go@v4
with:
go-version: 1.26.4

- name: Voting, checkpoint, streaming and scheduler race regressions
# Run the complete affected package suites, including subprocess crash
# recovery and cancellation tests.
run: >-
go test -race -p 2 -count=1
./pkg/alpenglow ./pkg/consensus ./pkg/replay ./pkg/rewards
./pkg/turbine ./pkg/sigverify ./pkg/blockprod/...
./cmd/mithril/node ./cmd/mithril/configcmd

- name: Interpreter differential and memory race regressions
run: go test -race -count=1 ./pkg/sbpf/...

- name: Sealevel interpreter, syscall and vote ownership regressions
run: go test -race -count=1 ./pkg/sealevel
13 changes: 12 additions & 1 deletion cmd/mithril/configcmd/configcmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,9 @@ authorized_voter_keypair = "" # BLS derivation signer (empty defaults to id
authorized_withdrawer_keypair = "" # Authorized withdrawer keypair path (diagnostics only)
tpu_quic_bind_addr = "0.0.0.0:8004"
advertised_ip = "" # Required only in validator mode; public IP advertised for TPU QUIC
wait_to_vote_slot = 0 # Minimum slot for new votes; does not bypass recovery checks
tpu_max_buffered_transactions = 0 # 0 = 131,072 buffered transactions
block_completion_reserve_ms = 0 # 0 = 75ms local completion/broadcast reserve
tpu_sigverify_workers = 0 # 0 = GOMAXPROCS

[consensus]
Expand All @@ -175,6 +178,9 @@ authorized_voter_keypair = "" # Empty defaults to
authorized_withdrawer_keypair = ""
tpu_quic_bind_addr = "0.0.0.0:8004"
advertised_ip = "" # REQUIRED: public IP advertised for TPU QUIC
wait_to_vote_slot = 0 # Minimum slot for new votes; does not bypass recovery checks
tpu_max_buffered_transactions = 0 # 0 = 131,072 buffered transactions
block_completion_reserve_ms = 0 # 0 = 75ms local completion/broadcast reserve
tpu_sigverify_workers = 0

[consensus]
Expand Down Expand Up @@ -261,7 +267,12 @@ max_rps = 8 # Verifier's own RPC budget (never shares the block-fe
# ── Replay tuning ────────────────────────────────────────────────────────
[tuning]
txpar = 24 # Validator auto-defaults to 2x CPU cores only when unset; explicit 0 = sequential
sigverify_backend = "auto" # auto|r51|generic|stdlib; stdlib uses Go's crypto/ed25519 impl after strict checks.

[sigverify]
backend = "auto" # auto|r51|generic|stdlib
workers = 0 # 0 = min(2, GOMAXPROCS); explicit value overrides the shared transaction pool
batch_target = 8 # 4 or 8 signature lanes; available work runs immediately
disable_shred_overlap = false # Diagnostic fallback: verify after complete block assembly

# ── Mithril's RPC server ─────────────────────────────────────────────────
[rpc]
Expand Down
28 changes: 28 additions & 0 deletions cmd/mithril/configcmd/configcmd_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package configcmd

import (
"strings"
"testing"

"github.com/spf13/viper"
"github.com/stretchr/testify/require"
)

func TestStarterConfigSignatureVerification(t *testing.T) {
for _, validator := range []bool{false, true} {
v := viper.New()
v.SetConfigType("toml")
require.NoError(t, v.ReadConfig(strings.NewReader(generateStarterConfig(validator))))
for _, key := range []string{"validator.wait_to_vote_slot", "validator.tpu_max_buffered_transactions", "validator.block_completion_reserve_ms"} {
require.True(t, v.IsSet(key), key)
require.Zero(t, v.GetInt(key), key)
}
require.Equal(t, "auto", v.GetString("sigverify.backend"))
require.True(t, v.IsSet("sigverify.workers"))
require.Zero(t, v.GetInt("sigverify.workers"))
require.Equal(t, 8, v.GetInt("sigverify.batch_target"))
require.True(t, v.IsSet("sigverify.disable_shred_overlap"))
require.False(t, v.GetBool("sigverify.disable_shred_overlap"))
require.False(t, v.IsSet("tuning.sigverify_backend"))
}
}
15 changes: 15 additions & 0 deletions cmd/mithril/node/config_bool.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package node

import "github.com/spf13/pflag"

// resolveBoolOption preserves explicit false at either precedence level.
// Defaults use DefValue, not a flag value potentially left by a previous run.
func resolveBoolOption(flag *pflag.Flag, configured bool, configuredValue bool) bool {
if flag != nil && flag.Changed {
return flag.Value.String() == "true"
}
if configured {
return configuredValue
}
return flag != nil && flag.DefValue == "true"
}
38 changes: 38 additions & 0 deletions cmd/mithril/node/config_bool_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package node

import (
"github.com/spf13/pflag"
"github.com/spf13/viper"
"github.com/stretchr/testify/require"
"strings"
"testing"
)

func TestResolveBoolOptionPrecedence(t *testing.T) {
for _, tc := range []struct {
name, toml, cli string
defaultValue, want bool
}{
{"omitted true default", "", "", true, true},
{"omitted false default", "", "", false, false},
{"TOML false", "enabled=false", "", true, false},
{"TOML true", "enabled=true", "", false, true},
{"CLI false beats TOML true", "enabled=true", "false", true, false},
{"CLI true beats TOML false", "enabled=false", "true", false, true},
{"CLI false without TOML", "", "false", true, false},
} {
t.Run(tc.name, func(t *testing.T) {
v := viper.New()
v.SetConfigType("toml")
require.NoError(t, v.ReadConfig(strings.NewReader(tc.toml)))
flags := pflag.NewFlagSet("test", pflag.ContinueOnError)
flags.Bool("enabled", tc.defaultValue, "")
if tc.cli != "" {
require.NoError(t, flags.Set("enabled", tc.cli))
}
require.Equal(t, tc.want, resolveBoolOption(flags.Lookup("enabled"), v.IsSet("enabled"), v.GetBool("enabled")))
})
}
require.False(t, resolveBoolOption(nil, false, false))
require.True(t, resolveBoolOption(nil, true, true))
}
Loading
Loading