Skip to content

chore: release v0.0.25 (seed per-source-IP connection cap) - #46

Merged
bdchatham merged 2 commits into
mainfrom
chore/release-v0.0.25
Jul 28, 2026
Merged

chore: release v0.0.25 (seed per-source-IP connection cap)#46
bdchatham merged 2 commits into
mainfrom
chore/release-v0.0.25

Conversation

@bdchatham

Copy link
Copy Markdown
Collaborator

Release bump for #45.

What it carries

applySeedOverrides now sets max_incoming_connection_attempts = 32.

That key caps concurrent connections per source IP (conn_tracker.go:33-38), not attempt rate as the name suggests. Upstream sei-tendermint leaves it equal to max_connections at 100/100, where it can never bind — so raising the seed total to 1000 made it the first real constraint while it still carried the inherited 100, letting a single source hold ~10% of a seed's inbound capacity.

Also records that AllowDuplicateIP is inert: sei-tendermint declares it, defaults it, and renders it into config.toml, but never reads it. It documented intent while providing nothing.

Delivery

seictl/sidecar/tasks/config_apply.go is the sole renderer of node config.toml, so the sidecar image is what makes this real on a running node. Chain: this tag → seictl bump + release → controller bump + release → platform images.sidecar per cluster, controller restart to reload platform config, which rolls that cluster's SeiNodes.

Rollout is staged between clusters, with prod last since that cell carries pacific-1 and atlantic-2 alongside arctic-1.

Prerequisite already met

The value is only meaningful where the load balancer preserves client IPs — under SNAT the cap multiplies against the balancer's address count rather than the peers'. arctic-1's seed-0 was in that state; sei-protocol/platform#1440 fixed it and preservation is verified live from two independent sources. seed-1/seed-2 were already preserving.

🤖 Generated with Claude Code

Carries #45: applySeedOverrides sets max_incoming_connection_attempts to 32.
That key caps CONCURRENT connections per source IP rather than attempt rate,
and upstream leaves it equal to max_connections (100/100) where it can never
bind — so raising the seed total to 1000 had left one source able to hold ~10%
of a seed's inbound. Also records that AllowDuplicateIP is inert: sei-tendermint
declares and renders it but never reads it.

Consumed next by seictl, whose sidecar renders config.toml
(sidecar/tasks/config_apply.go) and is therefore what makes this real on a
running node, and by sei-k8s-controller to keep its pin in sync.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@cursor

cursor Bot commented Jul 28, 2026

Copy link
Copy Markdown

PR Summary

Low Risk
Comment and version bump only; no executable configuration or logic changes in the diff.

Overview
Release v0.0.25version.json moves from v0.0.24 to v0.0.25, packaging the seed networking work described in the PR (including #45’s max_incoming_connection_attempts = 32 for seed mode).

This diff only rewrites comments in defaults.go: the GigaExecutor block is clarified (rendered app.toml can override seid’s binary default), and the seed MaxIncomingConnectionAttempts note is expanded to cover silent rejects without metrics, fleet sizing rationale, SNAT/LB client-IP assumptions, and that the accept path is NodeID-blind. No Go defaults or logic change appears in the patch itself.

Reviewed by Cursor Bugbot for commit aa85118. Bugbot is set up for automated code reviews on this repo. Configure here.

Comment-only; no behavior change.

The giga comment described a prior tree state ("previously rendered"), which a
reader cannot verify against the code in front of them. Restated as present fact,
keeping the pin instruction for nodes that must stay on the v2 executor.

The seed cap comment gave the mechanism ("multiplies against the LB's address
count") without the consequence, so it read as benign re-accounting: under SNAT
the ceiling collapses and legitimate peers are dropped, silently, because seed
mode serves no metrics. It now leads with the silent-rejection property, says
outright that this tightens 100 to 32, carries the measured basis for 32 (a fleet
maximum of 8 real peers per address) so the number stays checkable, and records
that the accept path is NodeID-blind and so bounds inbound persistent and
unconditional peers too.

Raised independently by idiomatic-reviewer and prose-steward while blinded.
Ledger: bdchatham-designs designs/seed-node-mode/xreview/sei-config-v0.0.25-rollout.md

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Suggested version: v0.0.25

Comparing to: v0.0.24 (diff)

Changes in go.mod file(s):

(empty)

gorelease says:

The following panic happened checking types near:
panic: runtime error: invalid memory address or nil pointer dereference [recovered, repanicked]
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x60b0b2]

goroutine 8 [running]:
go/types.(*Checker).handleBailout(0x2ceff17e2200, 0x2ceff1895c30)
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/check.go:473 +0x91
panic({0x6ea840?, 0x98eba0?})
	/opt/hostedtoolcache/go/1.26.5/x64/src/runtime/panic.go:860 +0x13a
go/types.(*StdSizes).Sizeof(0x0, {0x759c68, 0x992360})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/sizes.go:229 +0x312
go/types.(*Config).sizeof(...)
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/sizes.go:334
go/types.representableConst.func1(...)
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/const.go:77
go/types.representableConst({0x75ba60, 0x767900}, 0x2ceff17e2200, 0x992360, 0x2ceff1892fa8)
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/const.go:93 +0x1e9
go/types.(*Checker).representation(0x2ceff17e2200, 0x2ceff17c2100, 0x992360)
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/const.go:257 +0x5f
go/types.(*Checker).implicitTypeAndValue(0x2ceff17e2200, 0x2ceff17c2100, {0x759c68?, 0x992360?})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/expr.go:404 +0x3ed
go/types.(*Checker).assignment(0x2ceff17e2200, 0x2ceff17c2100, {0x759c68, 0x992360}, {0x73fbc2, 0x10})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/assignments.go:70 +0x445
go/types.(*Checker).initVar(0x2ceff17e2200?, 0x992360?, 0x2ceff17c2100?, {0x73fbc2?, 0x2ceff1bd4660?})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/assignments.go:181 +0x385
go/types.(*Checker).initVars(0x2ceff17e2200, {0x2ceff1782220, 0x1, 0xf80000?}, {0x2ceff17d8270, 0x423f7e?, 0x7f9aba24be20?}, {0x75b128, 0x2ceff17d3c60})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/assignments.go:413 +0x612
go/types.(*Checker).stmt(0x2ceff17e2200, 0x0, {0x75b128, 0x2ceff17d3c60})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/stmt.go:565 +0x6b7
go/types.(*Checker).stmtList(0x2ceff17e2200, 0x0, {0x2ceff17d8280?, 0x73bc80?, 0x5?})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/stmt.go:125 +0x85
go/types.(*Checker).stmt(0x2ceff17e2200, 0x0, {0x75b188, 0x2ceff1bd4690})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/stmt.go:603 +0x56e
go/types.(*Checker).stmt(0x2ceff17e2200, 0x0, {0x75b1b8, 0x2ceff1bda600})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/stmt.go:615 +0x25fd
go/types.(*Checker).stmtList(0x2ceff17e2200, 0x0, {0x2ceff17d3cc0?, 0x73bc80?, 0x5?})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/stmt.go:125 +0x85
go/types.(*Checker).stmt(0x2ceff17e2200, 0x0, {0x75b188, 0x2ceff1bd46f0})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/stmt.go:603 +0x56e
go/types.(*Checker).stmt(0x2ceff17e2200, 0x0, {0x75b1b8, 0x2ceff1bda640})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/stmt.go:615 +0x25fd
go/types.(*Checker).stmtList(0x2ceff17e2200, 0x0, {0x2ceff1862280?, 0x0?, 0x10?})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/stmt.go:125 +0x85
go/types.(*Checker).funcBody(0x2ceff17e2200, 0x75ac18?, {0x2ceff1bc61a0?, 0x2ceff1877a40?}, 0x2ceff1bdb100, 0x2ceff1bd48d0, {0x0?, 0x0?})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/stmt.go:42 +0x37b
go/types.(*Checker).funcDecl.func1()
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/decl.go:838 +0x3a
go/types.(*Checker).processDelayed(0x2ceff17e2200, 0x0)
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/check.go:595 +0x1e2
go/types.(*Checker).checkFiles(0x2ceff17e2200, {0x2ceff1782028?, 0x5c4d25?, 0x993280?})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/check.go:537 +0x3f9
go/types.(*Checker).Files(0x2ceff18b4000?, {0x2ceff1782028?, 0x2ceff17400c0?, 0x6?})
	/opt/hostedtoolcache/go/1.26.5/x64/src/go/types/check.go:491 +0x75
golang.org/x/tools/go/packages.(*loader).loadPackage(0x2ceff18b4000, 0x2ceff16e1ec0)
	/home/runner/go/pkg/mod/golang.org/x/tools@v0.2.0/go/packages/packages.go:1037 +0x8f2
golang.org/x/tools/go/packages.(*loader).loadRecursive.func1()
	/home/runner/go/pkg/mod/golang.org/x/tools@v0.2.0/go/packages/packages.go:847 +0x1a7
sync.(*Once).doSlow(0x0?, 0x0?)
	/opt/hostedtoolcache/go/1.26.5/x64/src/sync/once.go:78 +0xac
sync.(*Once).Do(...)
	/opt/hostedtoolcache/go/1.26.5/x64/src/sync/once.go:69
golang.org/x/tools/go/packages.(*loader).loadRecursive(0x1?, 0x2ceff1818fd0?)
	/home/runner/go/pkg/mod/golang.org/x/tools@v0.2.0/go/packages/packages.go:835 +0x3b
golang.org/x/tools/go/packages.(*loader).loadRecursive.func1.1(0x0?)
	/home/runner/go/pkg/mod/golang.org/x/tools@v0.2.0/go/packages/packages.go:842 +0x26
created by golang.org/x/tools/go/packages.(*loader).loadRecursive.func1 in goroutine 31
	/home/runner/go/pkg/mod/golang.org/x/tools@v0.2.0/go/packages/packages.go:841 +0x8c

gocompat says:

Your branch is up to date with 'origin/main'.

Cutting a Release (and modifying non-markdown files)

This PR is modifying both version.json and non-markdown files.
The Release Checker is not able to analyse files that are not checked in to main. This might cause the above analysis to be inaccurate.
Please consider performing all the code changes in a separate PR before cutting the release.

Automatically created GitHub Release

A draft GitHub Release has been created.
It is going to be published when this PR is merged.
You can modify its' body to include any release notes you wish to include with the release.

@bdchatham
bdchatham merged commit 6526c5e into main Jul 28, 2026
4 checks passed
@bdchatham
bdchatham deleted the chore/release-v0.0.25 branch July 28, 2026 22:07
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