Retry connect, and connect in parallel

This commit is contained in:
Jon Gjengset 2017-03-02 22:27:23 -05:00
parent d4e3e9154e
commit 90b1602ad1
No known key found for this signature in database
GPG Key ID: D64AC9D67176DC71
3 changed files with 74 additions and 13 deletions

31
Cargo.lock generated
View File

@ -6,6 +6,7 @@ dependencies = [
"mailparse 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"notify-rust 3.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"openssl 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)",
"rayon 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
"systray 0.1.1 (git+https://github.com/qdot/systray-rs.git?branch=linux-core)",
"toml 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"xdg 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -158,6 +159,14 @@ dependencies = [
"pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "deque"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "dtoa"
version = "0.4.1"
@ -510,6 +519,14 @@ name = "num-traits"
version = "0.1.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "num_cpus"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "openssl"
version = "0.8.3"
@ -635,6 +652,17 @@ dependencies = [
"libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rayon"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)",
"num_cpus 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "regex"
version = "0.2.1"
@ -886,6 +914,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum clang-sys 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4f98f0715ff67f27ca6a2f8f0ffc2a56f8edbc7acd57489c29eadc3a15c4eafe"
"checksum clap 2.20.5 (registry+https://github.com/rust-lang/crates.io-index)" = "7db281b0520e97fbd15cd615dcd8f8bcad0c26f5f7d5effe705f090f39e9a758"
"checksum dbus 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "58ec7b4cac6f79f36af1cd9cfdb9b935fc5a4e899f494ee03a3a6165f7d10b4b"
"checksum deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1614659040e711785ed8ea24219140654da1729f3ec8a47a9719d041112fe7bf"
"checksum dtoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80c8b71fd71146990a9742fc06dcbbde19161a267e0ad4e572c35162f4578c90"
"checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec"
"checksum encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91"
@ -923,6 +952,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce"
"checksum notify-rust 3.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "26508471f9e6ee12ebe949ece86ff01153e5d9a9ca331e0a6e9661502fb4e9a9"
"checksum num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "e1cbfa3781f3fe73dc05321bed52a06d2d491eaa764c52335cf4399f046ece99"
"checksum num_cpus 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a18c392466409c50b87369414a2680c93e739aedeb498eb2bff7d7eb569744e2"
"checksum openssl 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b11754cb6c81bb9e62faaf0eb6d94dde2aab0928c04db5078b74242880f35eb1"
"checksum openssl-sys 0.7.17 (registry+https://github.com/rust-lang/crates.io-index)" = "89c47ee94c352eea9ddaf8e364be7f978a3bb6d66d73176572484238dd5a5c3f"
"checksum pango 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d25afdf2915e8afee5d0c2fccd8426b7c32e3a58aaf7ed2b41a4609c64617de"
@ -937,6 +967,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum quasi_codegen 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b06172e92ab0099427609854ffb1512c377be5fc4beaf572ae5d5a01b8359596"
"checksum quoted_printable 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebb55456d1e18dddfac0fedcc552ed3f690a645c5629b39e1a9d2ae544313178"
"checksum rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "022e0636ec2519ddae48154b028864bdce4eaf7d35226ab8e65c611be97b189d"
"checksum rayon 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50c575b58c2b109e2fbc181820cbe177474f35610ff9e357dc75f6bac854ffbf"
"checksum regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4278c17d0f6d62dfef0ab00028feb45bd7d2102843f80763474eeb1be8a10c01"
"checksum regex-syntax 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9191b1f57603095f105d317e375d19b1c9c5c3185ea9633a99a6dcbed04457"
"checksum rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "237546c689f20bb44980270c73c3b9edd0891c1be49cc1274406134a66d3957b"

View File

@ -23,3 +23,4 @@ mailparse = "0.5.1"
toml = "0.3.1"
xdg = "2.0.0"
notify-rust = "3.2.1"
rayon = "0.6.0"

View File

@ -1,6 +1,7 @@
extern crate xdg;
extern crate toml;
extern crate imap;
extern crate rayon;
extern crate openssl;
extern crate systray;
extern crate mailparse;
@ -8,10 +9,12 @@ extern crate notify_rust;
use openssl::ssl::{SslContext, SslMethod};
use imap::client::Client;
use rayon::prelude::*;
use std::collections::HashSet;
use std::process::Command;
use std::io::prelude::*;
use std::time::Duration;
use std::sync::mpsc;
use std::fs::File;
use std::thread;
@ -122,23 +125,49 @@ fn main() {
// TODO: w.set_tooltip(&"Whatever".to_string());
// TODO: app.wait_for_message();
let accounts: Vec<_> = accounts.into_iter()
let accounts: Vec<_> = accounts.par_iter()
.filter_map(|a| {
let name = a.name;
Client::secure_connect(a.server, SslContext::new(SslMethod::Sslv23).unwrap())
.map(move |mut c| {
c.login(a.username, &a.password).unwrap();
assert!(c.capability().unwrap().iter().any(|c| c == "IDLE"));
c.select("INBOX").unwrap();
(String::from(name), c)
})
.map_err(move |e| {
println!("Failed to connect account {}: {}", name, e);
})
.ok()
let mut wait = 1;
for _ in 0..5 {
let c = Client::secure_connect(a.server,
SslContext::new(SslMethod::Sslv23).unwrap())
.and_then(|mut c| {
try!(c.login(a.username, &a.password));
let cap = try!(c.capability());
if !cap.iter().any(|c| c == "IDLE") {
return Err(imap::error::Error::BadResponse(cap));
}
try!(c.select("INBOX"));
Ok((String::from(a.name), c))
});
match c {
Ok(c) => return Some(c),
Err(imap::error::Error::Io(e)) => {
println!("Failed to connect account {}: {}; retrying in {}s",
a.name,
e,
wait);
thread::sleep(Duration::from_secs(wait));
}
Err(e) => {
println!("{} host produced bad IMAP tunnel: {}", a.name, e);
break;
}
}
wait *= 2;
}
None
})
.collect();
if accounts.is_empty() {
println!("No accounts in config worked; exiting...");
return;
}
// We have now connected
app.set_icon_from_file(&"/usr/share/icons/Faenza/stock/24/stock_connect.png".to_string()).ok();