From 9e2a0dc4538ebba935c842c9128a59afe6fe1fe5 Mon Sep 17 00:00:00 2001 From: "claude[bot]" Date: Mon, 2 Mar 2026 06:24:36 +0000 Subject: [PATCH] fix: retry HTTP request in clone bench for pasta networking readiness MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The clone.rs benchmark's clone_http() method made a single HTTP request immediately after snapshot restore, but pasta networking may need a moment to establish L4 translation after clone restore. This caused empty responses and panics on both x64 and arm64 CI. The exec.rs benchmark already had the correct retry logic (10 attempts with 500ms delays). Apply the same pattern to clone.rs. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- benches/clone.rs | 49 +++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/benches/clone.rs b/benches/clone.rs index 73e2452b..24167f6d 100644 --- a/benches/clone.rs +++ b/benches/clone.rs @@ -263,31 +263,34 @@ impl CloneFixture { std::thread::sleep(Duration::from_millis(50)); }; - // Make HTTP request to nginx - // verify_port_forwarding() runs after snapshot restore and confirms end-to-end - // data flow through pasta before health monitor starts. + // Make HTTP request to nginx (retry briefly — pasta networking may need + // a moment after clone restore to establish L4 translation) let addr = format!("{}:{}", loopback_ip, health_port); - let mut stream = TcpStream::connect(&addr).expect("failed to connect to nginx"); - stream - .set_read_timeout(Some(Duration::from_secs(5))) - .unwrap(); - stream - .set_write_timeout(Some(Duration::from_secs(5))) - .unwrap(); - - let request = "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n"; - stream - .write_all(request.as_bytes()) - .expect("failed to send HTTP request"); - - let mut response = Vec::new(); - let _ = stream.read_to_end(&mut response); - - let response_str = String::from_utf8_lossy(&response); - if !response_str.contains("200 OK") { + let mut last_response = String::new(); + let mut http_ok = false; + for attempt in 0..10 { + if attempt > 0 { + std::thread::sleep(Duration::from_millis(500)); + } + if let Ok(mut stream) = TcpStream::connect(&addr) { + stream.set_read_timeout(Some(Duration::from_secs(2))).ok(); + stream.set_write_timeout(Some(Duration::from_secs(2))).ok(); + let request = "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n"; + if stream.write_all(request.as_bytes()).is_ok() { + let mut response = Vec::new(); + let _ = stream.read_to_end(&mut response); + last_response = String::from_utf8_lossy(&response).to_string(); + if last_response.contains("200 OK") { + http_ok = true; + break; + } + } + } + } + if !http_ok { panic!( - "unexpected HTTP response: {}", - &response_str[..std::cmp::min(200, response_str.len())] + "unexpected HTTP response after 10 attempts: {}", + &last_response[..std::cmp::min(200, last_response.len())] ); }