Stalwart logs spurious "Address already in use" for [::]:PORT — dual-stack socket conflict from sed in ci/main.go #478
Closed
opened 2026-06-06 14:36:55 +00:00 by guettlibot
·
2 comments
No Branch/Tag Specified
main
issue-563-agentloop-validation
dummy-pr-test
issue-560-fix-firebase-run-url
issue-539-stable-imap-uid
issue-533-shared-email-list
plan-issue-555
drop-nix
plan-issue-484
plan-issue-539
plan-issue-535
plan-issue-474
plan-issue-533
fix-dagger-engineless-precommit
issue-521-fix-deploy-yml-wait-time-api
issue-502-fix-email-id-collision-mailbox
issue-492-eliminate-duplicate-build-runner
issue-494-website-change-detection
issue-491-parallelize-check
issue-478-fix-stalwart-dual-stack-bind
issue-475-allowed-addresses-glob
issue-473-search-result-reorder
issue-453-update-agentloop-defaults
issue-466-structured-search
issue-505-exclude-chaos-monkey-from-regular-ci
issue-509-fix-search-result-sorting
fix-ink-sparkle-remaining-tests
issue-506-fix-search-emails-tests
issue-504-runner-wait-time
issue-488-search-notes
issue-472-changelog-issue-links
issue-501-folder-search-local-sqlite
issue-486-fix-stale-test-shader-mismatch
fix/prevent-settled-search-rerun-473
issue-467-fix-search-stale-results
issue-446-installed-versions-in-changelog
issue-462-fix-pr
issue-448-chaos-monkey-test
issue-436-notes-on-emails
issue-429-unify-mail-display
issue-422-move-to-folder-create-new
issue-414-ensure-not-run-as-root
issue-424-unify-email-list-views
issue-419-trusted-senders-page
issue-425-fix-prs
test-foo
issue-421-bug-report
issue-383-fix-ci
issue-394-fix-deploy-flutter-version
issue-391-fix-ci-double-trigger
issue-376-combined-inbox-v2
issue-376-combined-inbox
issue-384-fix-open-prs
sops-migrate
issue-339-safe-first-on-imap-fetch
issue-340-try-catch-measure-height
issue-342-pin-intl-version
issue-341-guard-threademails-last
issue-335-agentloop-code-test
issue-329-fix
issue-315-fix
issue-320-fix
issue-325-fix
issue-312-fix
issue-311-fix
issue-305-fix
issue-304-fix
issue-299-fix
issue-300-fix
issue-298-fix
issue-296-fix
issue-294-fix
issue-289-fix
issue-288-fix
issue-287-fix
issue-286-fix
issue-277-fix
issue-282-fix
issue-280-fix
issue-272-fix
issue-268-fix
issue-267-fix
issue-266-fix
issue-258-fix
issue-260-fix
issue-257-fix
issue-253-fix
issue-216-fix
issue-251-fix
issue-249-fix
issue-question-fixes
issue-235-fix
issue-236-fix-v2
issue-237-fix
issue-236-fix
issue-228-fix
issue-217-fix
issue-214-fix
issue-213-fix
issue-208-fix
issue-205-fix
issue-204-fix
issue-203-fix
issue-202-fix
issue-129-fix
issue-161-fix
issue-160-fix
issue-201-fix
issue-210-fix
issue-198-fix
issue-200-fix
issue-144-fix
issue-199-fix
fix/playstore-upload-use-requests
issue-193-fix
issue-186-fix
issue-185-fix
issue-192-fix
issue-183-fix
issue-175-fix
issue-172-fix
issue-171-fix
issue-167-fix
issue-136-fix
issue-162-fix
issue-179-fix
issue-155-fix
issue-154-fix
issue-152-fix
issue-151-fix
issue-141-fix
issue-150-fix
issue-164-fix
migrate-to-dagger
task/d1-ci-matrix
task/a4-typeconverter-json
task/u7-onboarding-walkthrough
task/d3-sync-doc
task/a5-layer-boundary-lint
task/t5-golden-tests
task/p5-date-cache
task/s4-link-handling
task/p3-html-parse-isolate
task/u8-mark-all-read
task/u3-recent-searches
task/a3-jmap-injectable-http-client
task/r5-tls-error-handling
fix/playstore-redirect-retry
task/t3-repository-contract-tests
task/p2-email-list-pagination
task/p1-fts5-search
fix/playstore-upload-timeout
task/a1-email-detail-notifier
fix/upgrade-workmanager-0.9
fix/android-core-library-desugaring
task/p4-db-indexes
task/r3-html-error-boundary
task/d2-check-coverage
task/a2-email-tile
task/t4-migration-tests
task/t2-widget-tests
task/t1-email-repo-coverage
task/u6-connection-status
task/u4-push-notifications
task/u2-draft-sync
task/u1-list-unsubscribe
task/s2-hostname-validation
task/r6-reliability-fuzz-tests
task/r4-sync-error-banner
task/r2-force-resync
task/r1-undo-history-persistence
No results found.
Labels
Clear labels
NeedSupervisor
State/InProgress
State/Later
State/Planned
automerge
ci-failure
do-not-merge
loop/code
loop/code-ci-pending
loop/code-done
loop/code-in-process
loop/merge
loop/merge-done
loop/merge-in-process
loop/plan
loop/plan-done
loop/plan-in-process
Issue escalated to a human supervisor; agentloop will skip it until cleared.
Eligible for automatic merge by CI
Issue opened by agentloop to track a failing CI workflow; used for deduplication.
Plan PR — review only, do not merge.
Add to run the built-in "code" prompt; override at prompts/code.md.
Prompt "code" finished; waiting for the PR's CI to pass before advancing.
Prompt "code" finished successfully.
Agent for the "code" prompt is currently running on this issue.
Managed by agentloop
Managed by agentloop
Managed by agentloop
Add to run the built-in "plan" prompt; override at prompts/plan.md.
Prompt "plan" finished successfully.
Agent for the "plan" prompt is currently running on this issue.
No labels
NeedSupervisor
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: guettli/sharedinbox#478
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Symptom
Every CI run that starts the Stalwart test mail server logs four errors like these:
This appears in both passing and failing CI runs, so it is not the cause of test failures — but it clutters logs and could mask real network problems.
Root cause
stalwart-dev/config.tomlhas:The
Stalwart()function inci/main.goruns asedsubstitution that turns everybind = ["0.0.0.0:PORT"]into:On Linux with IPv6 dual-stack enabled (the Docker default), binding
0.0.0.0:PORTcreates a dual-stack socket that covers both IPv4 and IPv6 addresses. The subsequent attempt to bind[::]:PORTtherefore hitsEADDRINUSEimmediately, because the IPv6 address space is already claimed by the first socket.This affects all four ports (8080, 1430, 1025, 4190) consistently. Stalwart continues to function — its IPv4 listeners are active — so tests can still connect via the Dagger-internal
stalwarthostname (which resolves to an IPv4 address). The errors are cosmetic.Fix
Remove the second sed substitution from
ci/main.goso Stalwart keeps its original single-stack0.0.0.0:PORTbindings. The relevant line is:Drop the second
-eexpression entirely. The0.0.0.0:PORTbindings already handle all traffic within Dagger's internal network (which uses IPv4), so the[::]:PORTentries add no value and cause the error on every startup.The fix is in and the PR is open at https://codeberg.org/guettli/sharedinbox/pulls/481.
What I did:
In
ci/main.goat line 391, theStalwart()function was running asedcommand with two-eexpressions. The second one transformed everybind = ["0.0.0.0:PORT"]intobind = ["0.0.0.0:PORT", "[::]:PORT"]. On Linux with IPv6 dual-stack (the Dagger default), the first binding already claims both IPv4 and IPv6 via a dual-stack socket, so the second bind on[::]:PORTimmediately fails withEADDRINUSEon all four ports (8080, 1430, 1025, 4190).I dropped the second
-eexpression entirely, keeping only the hostname substitution. The0.0.0.0:PORTbindings continue to handle all traffic within Dagger's internal network.Verification: The change is a one-liner, mechanically matching the fix described in the issue. Backend and integration tests connect to Stalwart via the
stalwarthostname (which resolves to an IPv4 address), so removing the IPv6-only duplicate bindings has no functional impact.PR: https://codeberg.org/guettli/sharedinbox/pulls/481
The CI failure is infrastructure-wide — it has been failing for all runs (PRs and main branch pushes) since ~17:35 today, well before our PR was opened. The failure is in the Dagger remote engine SSH tunnel setup, which is external infrastructure I cannot fix.
Our code change is correct and minimal: it removes the sed expression that adds
[::]:PORTdual-stack bindings (causingEADDRINUSEon every Stalwart startup). The PR #481 is open, mergeable, and the branch is up to date with main.Summary:
PR #481 (https://codeberg.org/guettli/sharedinbox/pulls/481) was opened with the correct 1-line fix removing the spurious
[::]:PORTsed substitution fromci/main.go. The branch is not behind main and the PR is mergeable.CI has been failing for all runs since ~17:35 today — including main branch commits that predate our PR — due to a Dagger remote engine SSH tunnel connectivity issue in
scripts/setup_dagger_remote.sh. The failure affects every CI run (run indices 1852 onward), is completely unrelated to our code change, and is outside my ability to fix.