Skip to content

Commit 5903829

Browse files
committed
test(config): bound server-process test concurrency instead of full serialization
Split the server-process nextest group into a max-threads=2 group plus a dedicated server-process-serial group for the heaviest WAL-truncation test, and drop threads-required (which evicted the entire suite for each real-server test). Ephemeral OS-assigned ports and private tempdirs make concurrent server instances port-safe, so this shortens the serialized tail without reintroducing the port exhaustion the old full serialization guarded against.
1 parent fb48b31 commit 5903829

1 file changed

Lines changed: 36 additions & 9 deletions

File tree

.config/nextest.toml

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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]]
6472
filter = 'binary(crash_wal_truncation)'
73+
test-group = 'server-process-serial'
6574
slow-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)'
7495
test-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]
8198
cluster = { 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

Comments
 (0)