From a0ab77fdbe521bd379e29bad2d3b86d734f51d3b Mon Sep 17 00:00:00 2001 From: ualtinok <94532+ualtinok@users.noreply.github.com> Date: Wed, 28 Oct 2026 21:05:58 +0100 Subject: [PATCH 1/2] Linux: call statx through syscall(2) so release builds link on older glibc The v0.63.0 Linux ARM64 and x64 release builds failed to link with "undefined reference to statx". They build in cross images with a glibc older than 2.28, which has no statx wrapper, and the storage-cleanup mount check called libc::statx directly. syscall(2) needs no glibc symbol; a kernel without statx still refuses the repair. Co-authored-by: alfonso-aft <289616620+alfonso-aft@users.noreply.github.com> --- .../slice-descriptors/land-linux-statx-syscall.json | 12 ++++++++++++ crates/aft/src/bash_background/persistence.rs | 8 +++++++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 benchmarks/aft-search/slice-descriptors/land-linux-statx-syscall.json diff --git a/benchmarks/aft-search/slice-descriptors/land-linux-statx-syscall.json b/benchmarks/aft-search/slice-descriptors/land-linux-statx-syscall.json new file mode 100644 index 000000000..c9b2cbd52 --- /dev/null +++ b/benchmarks/aft-search/slice-descriptors/land-linux-statx-syscall.json @@ -0,0 +1,12 @@ +{ + "slice_class": "non_ranking", + "targeted_mechanism": "none", + "kind": "harness", + "fixtures": [ + "harness-goldens" + ], + "slices": [ + "linux-statx-syscall" + ], + "note": "Linux release link fix: statx through syscall(2). No changed path matches RANKING_FENCE_PREFIXES." +} diff --git a/crates/aft/src/bash_background/persistence.rs b/crates/aft/src/bash_background/persistence.rs index 101d1a98b..200b8c6fa 100644 --- a/crates/aft/src/bash_background/persistence.rs +++ b/crates/aft/src/bash_background/persistence.rs @@ -1722,8 +1722,14 @@ fn file_mount_identity(file: &File) -> io::Result<(u64, Vec)> { #[cfg(target_os = "linux")] { let mut stat = std::mem::MaybeUninit::::zeroed(); + // Call statx through syscall(2), not glibc's wrapper: the wrapper only + // exists from glibc 2.28, and the Linux release binary is linked + // against an older glibc so it runs on older distributions. A kernel + // without statx fails with ENOSYS, which refuses the repair like any + // other unverifiable mount boundary. if unsafe { - libc::statx( + libc::syscall( + libc::SYS_statx, file.as_raw_fd(), c"".as_ptr(), libc::AT_EMPTY_PATH | libc::AT_SYMLINK_NOFOLLOW, From 7f8ab5e501e166737ca810850c7f614adc7ba162 Mon Sep 17 00:00:00 2001 From: ualtinok <94532+ualtinok@users.noreply.github.com> Date: Wed, 28 Oct 2026 22:05:51 +0100 Subject: [PATCH 2/2] Callgraph respawn test waits 60 s for its child's barrier issue_250_respawn_loop_converges_or_trips_without_false_readiness gave a freshly spawned test process 10 s to build a call graph and reach its barrier; a loaded macOS runner took longer. Co-authored-by: alfonso-aft <289616620+alfonso-aft@users.noreply.github.com> --- crates/aft/src/callgraph_store/mod.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/aft/src/callgraph_store/mod.rs b/crates/aft/src/callgraph_store/mod.rs index 0c408d3be..5c38e7001 100644 --- a/crates/aft/src/callgraph_store/mod.rs +++ b/crates/aft/src/callgraph_store/mod.rs @@ -32679,7 +32679,10 @@ mod bounded_build_breaker_tests { const SPECIMEN_CHILD_SIGNAL: &str = "AFT_SPECIMEN_CHILD_SIGNAL"; fn wait_for_child_barrier(path: &Path) { - let deadline = Instant::now() + Duration::from_secs(10); + // The child is a fresh test-binary process that builds a call graph + // before it reaches the barrier; a loaded macOS runner needed more + // than 10 s for that. + let deadline = Instant::now() + Duration::from_secs(60); while !path.exists() { assert!( Instant::now() < deadline,