virtmgr: Wait for socket file before connecting
vhost-user-fs backend socket file has to be created;
wait for the file to be created before connecting.
Bug: 372171883
Test: Verify virtiofs mounts inside Terminal App under /mnt/shared
Change-Id: Id33c0af32162d1c2918ea8c05285ed57006fa560
Signed-off-by: Akilesh Kailash <akailash@google.com>
diff --git a/android/virtmgr/src/crosvm.rs b/android/virtmgr/src/crosvm.rs
index b2283d0..b28834a 100644
--- a/android/virtmgr/src/crosvm.rs
+++ b/android/virtmgr/src/crosvm.rs
@@ -1244,6 +1244,9 @@
}
for shared_path in &config.shared_paths {
+ if let Err(e) = wait_for_file(&shared_path.socket_path, 5) {
+ bail!("Error waiting for file: {}", e);
+ }
command
.arg("--vhost-user-fs")
.arg(format!("{},tag={}", &shared_path.socket_path, &shared_path.tag));
@@ -1269,6 +1272,23 @@
Ok(result)
}
+fn wait_for_file(path: &str, timeout_secs: u64) -> Result<(), std::io::Error> {
+ let start_time = std::time::Instant::now();
+ let timeout = Duration::from_secs(timeout_secs);
+
+ while start_time.elapsed() < timeout {
+ if std::fs::metadata(path).is_ok() {
+ return Ok(()); // File exists
+ }
+ thread::sleep(Duration::from_millis(100));
+ }
+
+ Err(std::io::Error::new(
+ std::io::ErrorKind::NotFound,
+ format!("File not found within {} seconds: {}", timeout_secs, path),
+ ))
+}
+
/// Ensure that the configuration has a valid combination of fields set, or return an error if not.
fn validate_config(config: &CrosvmConfig) -> Result<(), Error> {
if config.bootloader.is_none() && config.kernel.is_none() {