Repository navigation
Run a kubo with the go-libp2p inbound-slot leak fix on sing-1's content node and chic-1's bootstrap-b - #37
Merged
Merged
Conversation
Collaborator
Author
|
@claude review opus |
|
Claude review failed to run. See https://github.com/ipni/workers/actions/runs/43038176591 |
1 similar comment
|
Claude review failed to run. See https://github.com/ipni/workers/actions/runs/43038176591 |
…nt node The content images move from k8s/content/kustomization.yaml into roles/content/defaults/main.yml, so a box can override them in host_vars. sing-1 overrides kubo with ghcr.io/ipni/kubo, which is ipfs/kubo v0.43.1 plus libp2p/go-libp2p#3568 and nothing else; lith-1 and chic-1 are the control. The default render is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A bootstrapper instance can now set its own kubo image (kubo_image in its bootstrap_extra_instances entry); the default moves to roles/bootstrap/defaults/main.yml. chic-1's bootstrap-b runs the canary, and bootstrap on the same box is its control. Every other render is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TakGN
force-pushed
the
content-kubo-rcmgr-canary
branch
from
November 11, 2026 17:14
e5cff67 to
fd5edb6
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of libp2p/go-libp2p#3564 and ipfs/kubo#11480 (the inbound-slot leak that #10 and #11 gave headroom for).
Why
The go-libp2p fix, libp2p/go-libp2p#3568, is merged to master (
da148e11) but is in no release yet. Upstream tested it with synthetic loopback traffic and asked operators who see the leak to try it on production nodes, to find out whether it is the whole leak.Our content kubos still leak, so a restart is due anyway. Leaked inbound slots on 2026-11-11, measured as system − transient − live inbound, out of a 65536 limit:
Running one box with the fix and two without gives a clean comparison under the same traffic. On the old build, a box leaks about 30 slots an hour, so a few hours already show which is which.
The bootstrappers see far more short-lived connections from DHT clients, so they are the more demanding test: if the fix misses a leak path, it should show there. chic-1 runs two bootstrappers, so
bootstrap-bgets the fix andbootstrapon the same box is the control. Since their restart on 2026-11-02, the bootstrappers have leaked about 400–690 slots a day each, far below the 262144 limit, so this restart is only for the test.The image
ghcr.io/ipni/kubo:v0.43.1-rcmgr-fix(sha256:44f66498…) is ipfs/kubo v0.43.1 (acc53c0) built by kubo's own Dockerfile. The only change is to go-libp2p:go.modreplaces go-libp2p withlidel/go-libp2p@9c4ee60(v0.49.0 plus a quic-go bump).p2p/net/upgrader/listener.go. The surrounding code is identical to upstream, and the new upstream testTestAcceptDoesNotBlockOnClosefails without the fix and passes with it.go version -mon the binary matches the deployed upstream image except for the go-libp2p line: same Go 1.26.5, same CGO setting, same build settings and dependencies. The version string is unchanged (0.43.1-acc53c0), so the box and the image digest are what tell the canary apart.Change
k8s/content/kustomization.yaml→kustomization.yaml.j2: the kubo and ipfs-cluster images come from role variables.roles/content/defaults/main.yml:content_kubo_imageandcontent_cluster_image, with the same digests and comments as before.host_vars/sing-1/content.yml: sing-1 overridescontent_kubo_imagewith the canary. lith-1 and chic-1 stay on upstream v0.43.1 as the control.scripts/recover-upstream-pinset.sh: reads the images from the role defaults instead of the kustomization, so it always uses upstream kubo.k8s/bootstrap/kustomization.yaml.j2,roles/bootstrap/defaults/main.yml,roles/bootstrap/tasks/main.yml: a bootstrapper instance can set its ownkubo_imagein itsbootstrap_extra_instancesentry. The default (bootstrap_default_kubo_image) is the same v0.43.1 digest as before.host_vars/chic-1/bootstrap.yml:bootstrap-bruns the canary.README.md: a short Images note under "Content cluster node".Checked
scripts/render-manifests.yml, built withkubectl kustomize: the default render ofcontentis byte-identical tomain, and no other directory changes. With sing-1's vars, only the two kuboimage:lines change (the init container and the daemon).bootstrap_instancesthe way the role does: only chic-1bootstrap-bgetsghcr.io/ipni/kubo; sing-1, lith-1 and chic-1bootstrapkeepipfs/kubo@sha256:b293….scripts/bootstrap-dns.pyprints the same records as onmain.peerlogplugin, which ProbeLab's data comes from (compiled in, as upstream).ansible-playbook --syntax-check content.yml, plus a YAML parse of the changed files and the script's image lookup.yamllintandansible-lint. CI runs them.After merging
Merging deploys nothing; content.yml and bootstrap.yml are run from a controller.
Since #38 merged,
mainmatches the content boxes again: a dry run ofcontent.ymlfrom #38 on all three boxes left the gateway, the pinning proxy, the Secrets and the certificates unchanged. It does put back what the 2026-10-21 deploy had rolled back from #9 and #10 (ipfs-cluster metrics,IPFS_FD_MAXandMaxFileDescriptors131072), so the first run restarts each content kubo once. On sing-1 that restart also brings in the canary.bootstrap-bon chic-1 has run this branch since 2026-11-11 15:35 UTC (bootstrap.yml -l chic-1from the branch). Until this merges, abootstrap.ymlrun on chic-1 frommainwould put it back on upstream kubo.ansible-playbook content.yml -l sing-1 --check --diff ansible-playbook content.yml -l sing-1 ansible-playbook content.yml # no change on lith-1/chic-1; checks peeringThe rollout restarts sing-1's content pod, which also clears its leaked slots. Then compare the leaked-slot gauge across the three boxes for 24–48 hours (the
ContentInboundSlotsLeakingexpression in ipni/infra) and report back upstream.Rollback: remove the override from
host_vars/sing-1/content.ymland runcontent.yml -l sing-1, or removekubo_imagefrombootstrap-band runbootstrap.yml -l chic-1. Remove it too once a kubo release has the fix.🤖 Generated with Claude Code