From 40f66f33334ce5ee328d63d6e0e1439d89acd2d7 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Thu, 11 Jun 2020 11:46:15 +0300 Subject: [PATCH] imap: modify connection timeouts --- melib/src/backends/imap.rs | 22 +++++++++++++--------- melib/src/backends/imap/connection.rs | 12 ++++++++++++ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs index 774e2c51..722691d8 100644 --- a/melib/src/backends/imap.rs +++ b/melib/src/backends/imap.rs @@ -174,7 +174,7 @@ pub(self) fn try_lock( dur: Option, ) -> Result> { let now = Instant::now(); - while Instant::now().duration_since(now) <= dur.unwrap_or(std::time::Duration::from_millis(150)) + while Instant::now().duration_since(now) <= dur.unwrap_or(std::time::Duration::from_millis(100)) { if let Ok(guard) = connection.try_lock() { return Ok(guard); @@ -188,19 +188,23 @@ impl MailBackend for ImapType { //if let Ok(mut g) = try_lock(&self.connection, None) { // let _ = g.connect(); //} - try_lock(&self.uid_store.is_online, None)?.1.clone() + try_lock( + &self.uid_store.is_online, + Some(std::time::Duration::from_millis(12)), + )? + .1 + .clone() } fn connect(&mut self) { - if self.is_online().is_err() { - if Instant::now().duration_since(self.uid_store.is_online.lock().unwrap().0) - >= std::time::Duration::new(2, 0) - { - if let Ok(mut g) = try_lock(&self.connection, None) { + let connection = self.connection.clone(); + let _ = std::thread::Builder::new() + .name(format!("{} connecting", self.account_name.as_str(),)) + .spawn(move || { + if let Ok(mut g) = try_lock(&connection, None) { let _ = g.connect(); } - } - } + }); } fn get(&mut self, mailbox: &Mailbox) -> Async>> { diff --git a/melib/src/backends/imap/connection.rs b/melib/src/backends/imap/connection.rs index 51236d27..f83c2b56 100644 --- a/melib/src/backends/imap/connection.rs +++ b/melib/src/backends/imap/connection.rs @@ -639,6 +639,7 @@ impl Iterator for ImapBlockingConnection { fn next(&mut self) -> Option { self.result.drain(0..self.prev_res_length); self.prev_res_length = 0; + let mut prev_failure = None; let ImapBlockingConnection { ref mut prev_res_length, ref mut result, @@ -660,12 +661,23 @@ impl Iterator for ImapBlockingConnection { *prev_res_length = pos + b"\r\n".len(); return Some(result[0..*prev_res_length].to_vec()); } + prev_failure = None; } Err(e) if e.kind() == std::io::ErrorKind::WouldBlock || e.kind() == std::io::ErrorKind::Interrupted => { debug!(&e); + if let Some(prev_failure) = prev_failure.as_ref() { + if Instant::now().duration_since(*prev_failure) + >= std::time::Duration::new(60 * 5, 0) + { + *err = Some(e.to_string()); + return None; + } + } else { + prev_failure = Some(Instant::now()); + } continue; } Err(e) => {