@@ -58,28 +58,55 @@ slow-timeout = { period = "30s", terminate-after = 6 }
5858# row and immediately kills the process, so the default 30s × 4 = 120s ceiling
5959# is too tight to distinguish "slow" from "hung". Only the ceiling moves — the
6060# in-test truncation wait is bounded separately and fails on its own.
61- # Settings are resolved per-key by first match, so the group/threads settings
62- # from the override below still apply to this binary.
61+ #
62+ # These are also the heaviest real-server tests, so they get their OWN group
63+ # ('server-process-serial', max-threads = 1) rather than the shared
64+ # 'server-process' group (max-threads = 2): running two of them at once makes
65+ # each contend for disk/CPU and creep toward the ceiling above, worst on a
66+ # small runner. Serializing just these keeps each one fast while the lighter
67+ # crash/shutdown tests still parallelize. They still overlap the rest of the
68+ # suite (different group), so this is NOT the old whole-suite eviction.
69+ # Settings are resolved per-key by first match, so this test-group wins over the
70+ # general server-process override below for this binary.
6371[[profile .default .overrides ]]
6472filter = ' binary(crash_wal_truncation)'
73+ test-group = ' server-process-serial'
6574slow-timeout = { period = " 30s" , terminate-after = 8 }
6675
6776# Tests that spawn REAL `nodedb` server OS processes (crash-recovery,
6877# startup-failure, shutdown lifecycle). Each brings up a full Data Plane
6978# (per-core threads, jemalloc arenas, listeners); running several at once
7079# exhausts ports / connections and causes spurious `ConnectionRefused`.
71- # Serialize them like the cluster group so at most one runs at a time.
80+ #
81+ # `test-group = 'server-process'` caps concurrency (see `[test-groups]` below)
82+ # so only a bounded number of these run at once. Port safety does not depend on
83+ # that cap: the harness picks ephemeral (OS-assigned) ports and a private
84+ # tempdir per instance, so any two can run side by side without colliding.
85+ #
86+ # We deliberately do NOT set `threads-required = 'num-test-threads'` here
87+ # (unlike the cluster group). That flag would make a running server test EVICT
88+ # the entire rest of the suite (every other test idles every other core for the
89+ # full duration of each server test), a large serial tail in stage 1. These are
90+ # single-node, ephemeral-port servers: the cheap in-process unit tests run
91+ # alongside them without stealing ports, and single-node boot is fast enough
92+ # that readiness does not need every core free.
7293[[profile .default .overrides ]]
73- filter = ' binary(crash_recovery) | binary(crash_recovery_overlays) | binary(crash_recovery_analytics) | binary(crash_wal_truncation) | binary( startup_failure) | binary(shutdown_in_flight) | binary(shutdown_budget) | binary(shutdown_abort_offender) | binary(shutdown_idempotent)'
94+ filter = ' binary(crash_recovery) | binary(crash_recovery_overlays) | binary(crash_recovery_analytics) | binary(startup_failure) | binary(shutdown_in_flight) | binary(shutdown_budget) | binary(shutdown_abort_offender) | binary(shutdown_idempotent)'
7495test-group = ' server-process'
75- # Claim every slot so each real-server test runs strictly ALONE — no other
76- # server-spawning test (in-process or OS-process) runs alongside to steal
77- # ports/CPU and cause spurious connection failures.
78- threads-required = ' num-test-threads'
7996
8097[test-groups ]
8198cluster = { max-threads = 1 }
82- server-process = { max-threads = 1 }
99+ # Up to 2 real-server tests concurrently. Each picks ephemeral (OS-assigned)
100+ # ports + a private tempdir, so two running side by side never collide on
101+ # ports/files; 2 single-core servers fit any CI runner, and CI `retries`
102+ # cover the rare ephemeral-port reuse race. This shortens the serialized
103+ # server-process tail without reintroducing the port exhaustion the old full
104+ # serialization guarded against.
105+ server-process = { max-threads = 2 }
106+ # The heaviest real-server tests (WAL-truncation), serialized so two never
107+ # contend and creep toward their timeout ceiling. Still overlaps the rest of
108+ # the suite — this only prevents the heavy tests from doubling up on each other.
109+ server-process-serial = { max-threads = 1 }
83110
84111[profile .ci ]
85112# CI inherits the default profile (cluster group, threads-required,
0 commit comments