diff options
author | Rob Bradford <robert.bradford@intel.com> | 2020-02-04 16:41:05 +0000 |
---|---|---|
committer | Andreea Florescu <andreea.florescu15@gmail.com> | 2020-09-04 17:59:53 +0300 |
commit | 19e14bc77b144283d6e6b879258120dbd687ef78 (patch) | |
tree | 382b6e3a3958f08fac0a0ec25d18f253c2417cb7 /src | |
parent | c650790558a32790e4ce6e91b49662161a1fbfd1 (diff) | |
download | vmm_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.rs | 26 |
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)) } } |