Skip to content

fix(policy): adaptive reverse pool 32→3 (source drifted from intended); rebuild bundle.wasm - #4109

Merged
0pcom merged 1 commit into
skycoin:developfrom
0pcom:fix/adaptive-standby-pool-size
Aug 23, 2026
Merged

fix(policy): adaptive reverse pool 32→3 (source drifted from intended); rebuild bundle.wasm#4109
0pcom merged 1 commit into
skycoin:developfrom
0pcom:fix/adaptive-standby-pool-size

Conversation

@0pcom

@0pcom 0pcom commented Aug 23, 2026

Copy link
Copy Markdown
Collaborator

Release-gate validation of the adaptive default (auto-started skysocks-client over :1080) found a throughput regression: the reverse mux was ReverseMux = 1 + adaptStandbyMax(31) = 32 legs. Standing up 31 disjoint multi-hop reverse routes over the mesh is a setup-node dial storm (each warm-standby leg re-dials forever on context deadline exceeded), and a bulk download over the 32-leg group stalls — 10MB timed out, 100KB ran at ~8 KB/s — instead of aggregating.

The source const had drifted: the preset tests already assert ReverseMux=3 (1 active + 2 standby → intended adaptStandbyMax=2), while the const sat at 31 and the committed bundle.wasm encoded 32 — so native (32) and the test/bundle disagreed and TestAdaptiveDecides was effectively broken on develop. Realign the const to 2 and rebuild bundle.wasm from source (TinyGo, replace→worktree) so native↔wazero are byte-identical again (TestDecideParity + TestAdaptiveDecides pass).

Complements #4108 (control-plane no-mux). A proxy wants a small, fully-fillable pool; resilience comes from the pool being healthy, not huge.

…); rebuild bundle.wasm

The adaptive default's reverse (download) mux was ReverseMux = adaptRevActive(1)
+ adaptStandbyMax(31) = 32. Live measurement (release-gate validation) showed
this is a throughput regression, not resilience headroom: standing up 31
DISJOINT multi-hop reverse routes over the mesh is a setup-node dial storm
(each warm-standby leg needs its own route-setup handshake; they fail
"setup-node dial: context deadline exceeded" and self-heal re-dials forever),
and a bulk download over the 32-leg group STALLS — 10MB timed out; 100KB ran at
~8 KB/s — instead of aggregating.

The source const had DRIFTED: the preset tests already assert ReverseMux=3
(1 active + 2 warm standby), i.e. the intended adaptStandbyMax=2, while the
const sat at 31 and the committed bundle.wasm encoded 32 — so native (32) and
the test/bundle (3) disagreed and TestAdaptiveDecides was effectively broken on
develop. Realign the const to 2 and rebuild bundle.wasm from source (TinyGo,
replace→worktree) so native↔wazero decisions are byte-identical again
(TestDecideParity + TestAdaptiveDecides pass).

A proxy wants a small, fully-fillable pool; resilience comes from the pool being
HEALTHY, not huge. Complements skycoin#4108 (control-plane no-mux) and the same
setup-node churn behind the mux-stall work.
@0pcom
0pcom merged commit f4e2888 into skycoin:develop Aug 23, 2026
12 of 16 checks passed
@0pcom
0pcom deleted the fix/adaptive-standby-pool-size branch August 23, 2026 00:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant