fix(gamestream/tests): sender_delivers_batches flaked under CI load — burst overflowed the default socket buffer
apple / swift (push) Successful in 1m12s
apple / screenshots (push) Successful in 4m26s
windows-host / package (push) Successful in 6m25s
ci / rust (push) Successful in 5m5s
ci / web (push) Successful in 51s
ci / docs-site (push) Successful in 1m4s
android / android (push) Failing after 10m7s
deb / build-publish (push) Successful in 3m35s
decky / build-publish (push) Successful in 21s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 6s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 5s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 4s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 4s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 3s
ci / bench (push) Successful in 4m38s
rpm / build-publish (bazzite, punktfunk-fedora-rpm) (push) Successful in 9m53s
rpm / build-publish (fedora-44, punktfunk-fedora44-rpm) (push) Successful in 9m53s
docker / deploy-docs (push) Successful in 18s
apple / swift (push) Successful in 1m12s
apple / screenshots (push) Successful in 4m26s
windows-host / package (push) Successful in 6m25s
ci / rust (push) Successful in 5m5s
ci / web (push) Successful in 51s
ci / docs-site (push) Successful in 1m4s
android / android (push) Failing after 10m7s
deb / build-publish (push) Successful in 3m35s
decky / build-publish (push) Successful in 21s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 6s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 5s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 4s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 4s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 3s
ci / bench (push) Successful in 4m38s
rpm / build-publish (bazzite, punktfunk-fedora-rpm) (push) Successful in 9m53s
rpm / build-publish (fedora-44, punktfunk-fedora44-rpm) (push) Successful in 9m53s
docker / deploy-docs (push) Successful in 18s
The test burst 3×100 1200 B datagrams into an undrained loopback socket: at ~2.5 KB kernel truesize each, the default ~212 KB rmem holds only ~80, so on a starved CI runner (parallel release builds) the kernel silently dropped the overflow and the recv loop could never reach 300 — surfacing as WouldBlock after the 3 s timeout. Size the burst (3×20) to fit the default buffer even with zero concurrent draining, and give recv a starvation-tolerant 10 s. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -820,8 +820,10 @@ mod tests {
|
||||
#[test]
|
||||
fn sender_delivers_batches() {
|
||||
let rx_sock = UdpSocket::bind("127.0.0.1:0").unwrap();
|
||||
// Generous: on a CI host saturated by parallel release builds, this thread can be
|
||||
// starved for whole seconds between recv() wakeups.
|
||||
rx_sock
|
||||
.set_read_timeout(Some(Duration::from_secs(3)))
|
||||
.set_read_timeout(Some(Duration::from_secs(10)))
|
||||
.unwrap();
|
||||
let tx_sock = UdpSocket::bind("127.0.0.1:0").unwrap();
|
||||
tx_sock.connect(rx_sock.local_addr().unwrap()).unwrap();
|
||||
@@ -837,10 +839,15 @@ mod tests {
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
// 3 frames of 100 packets, content-tagged for verification.
|
||||
// 3 frames of 20 packets, content-tagged for verification. The TOTAL burst must fit
|
||||
// the receive socket's DEFAULT buffer even if this thread never drains concurrently
|
||||
// (a starved CI runner): a 1200 B datagram costs ~2.5 KB kernel truesize, and the
|
||||
// default rmem (~212 KB) holds only ~80 — a bigger burst gets silently dropped by
|
||||
// the kernel and the test can never complete (the old 3×100 flaked exactly there).
|
||||
const PER_FRAME: usize = 20;
|
||||
let mut sent = Vec::new();
|
||||
for f in 0..3u8 {
|
||||
let batch: PacketBatch = (0..100u8)
|
||||
let batch: PacketBatch = (0..PER_FRAME as u8)
|
||||
.map(|i| {
|
||||
let mut p = vec![0u8; 1200];
|
||||
p[0] = f;
|
||||
@@ -859,10 +866,10 @@ mod tests {
|
||||
let n = rx_sock.recv(&mut buf).expect("packet within timeout");
|
||||
assert_eq!(n, 1200);
|
||||
let (f, i) = (buf[0] as usize, buf[1] as usize);
|
||||
assert_eq!(&buf[..n], &sent[f * 100 + i][..], "payload intact");
|
||||
assert_eq!(&buf[..n], &sent[f * PER_FRAME + i][..], "payload intact");
|
||||
got += 1;
|
||||
}
|
||||
assert_eq!(got, 300);
|
||||
assert_eq!(got, 3 * PER_FRAME);
|
||||
assert!(running.load(Ordering::SeqCst), "no spurious client-gone");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user