From d054dddcb35df669a349a23a8b5b9f1f346f9aba Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Tue, 4 Feb 2020 16:41:05 +0000 Subject: [PATCH] vm-virtio: Retry connections to vhost-user backends If the connection to the backend fails, sleep and retry up to a count. This failure could happen because the backend is not yet ready to handle the connection which is a common case when working with a spawned backend. Signed-off-by: Rob Bradford --- vhost_rs/src/vhost_user/master.rs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/vhost_rs/src/vhost_user/master.rs b/vhost_rs/src/vhost_user/master.rs index 72a52bf15..543f8741b 100644 --- a/vhost_rs/src/vhost_user/master.rs +++ b/vhost_rs/src/vhost_user/master.rs @@ -85,13 +85,31 @@ impl Master { /// Create a new vhost-user master endpoint. /// + /// Will retry as the backend may not be ready to accept the connection. + /// /// # Arguments /// * `path` - path of Unix domain socket listener to connect to pub fn connect(path: &str, max_queue_num: u64) -> Result { - Ok(Self::new( - Endpoint::::connect(path)?, - max_queue_num, - )) + let mut retry_count = 5; + let endpoint = loop { + match Endpoint::::connect(path) { + Ok(endpoint) => break Ok(endpoint), + Err(e) => match &e { + VhostUserError::SocketConnect(why) => { + if why.kind() == std::io::ErrorKind::ConnectionRefused && retry_count > 0 { + std::thread::sleep(std::time::Duration::from_millis(100)); + retry_count -= 1; + continue; + } else { + break Err(e); + } + } + _ => break Err(e), + }, + } + }?; + + Ok(Self::new(endpoint, max_queue_num)) } }