summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRob Bradford <robert.bradford@intel.com>2020-02-04 16:41:05 +0000
committerAndreea Florescu <andreea.florescu15@gmail.com>2020-09-04 17:59:53 +0300
commit19e14bc77b144283d6e6b879258120dbd687ef78 (patch)
tree382b6e3a3958f08fac0a0ec25d18f253c2417cb7 /src
parentc650790558a32790e4ce6e91b49662161a1fbfd1 (diff)
downloadvmm_vhost-19e14bc77b144283d6e6b879258120dbd687ef78.tar.gz
vhost-user: Retry connect 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 <robert.bradford@intel.com>
Diffstat (limited to 'src')
-rw-r--r--src/vhost_user/master.rs26
1 files changed, 22 insertions, 4 deletions
diff --git a/src/vhost_user/master.rs b/src/vhost_user/master.rs
index fe6104d..ffed909 100644
--- a/src/vhost_user/master.rs
+++ b/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<Self> {
- Ok(Self::new(
- Endpoint::<MasterReq>::connect(path)?,
- max_queue_num,
- ))
+ let mut retry_count = 5;
+ let endpoint = loop {
+ match Endpoint::<MasterReq>::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))
}
}