Skip to content

Commit dcf6ffe

Browse files
committed
fix(imap): fail fast on LIST errors
async-imap returns infinite stream of errors in case of EOF or timeout on the input stream, so attempting to skip and log errors results in busy loop similar to this: 2023-12-22T13:07:35.751Z core/event WARNING "" 2 "/__w/deltachat-core-rust/deltachat-core-rust/src/imap/scan_folders.rs:112: list_folders() can't get folder: io: timed out: timed out" 2023-12-22T13:07:35.751Z core/event WARNING "" 2 "/__w/deltachat-core-rust/deltachat-core-rust/src/imap/scan_folders.rs:112: list_folders() can't get folder: io: timed out: timed out" 2023-12-22T13:07:35.751Z core/event WARNING "" 2 "/__w/deltachat-core-rust/deltachat-core-rust/src/imap/scan_folders.rs:112: list_folders() can't get folder: io: timed out: timed out" 2023-12-22T13:07:35.751Z core/event WARNING "" 2 "/__w/deltachat-core-rust/deltachat-core-rust/src/imap/scan_folders.rs:112: list_folders() can't get folder: io: timed out: timed out" 2023-12-22T13:07:35.752Z core/event WARNING "" 2 "/__w/deltachat-core-rust/deltachat-core-rust/src/imap/scan_folders.rs:112: list_folders() can't get folder: io: timed out: timed out" 2023-12-22T13:07:35.752Z core/event WARNING "" 2 "/__w/deltachat-core-rust/deltachat-core-rust/src/imap/scan_folders.rs:112: list_folders() can't get folder: io: timed out: timed out" 2023-12-22T13:07:35.752Z core/event WARNING "" 2 "/__w/deltachat-core-rust/deltachat-core-rust/src/imap/scan_folders.rs:112: list_folders() can't get folder: io: timed out: timed out" 2023-12-22T13:07:35.752Z core/event WARNING "" 2 "/__w/deltachat-core-rust/deltachat-core-rust/src/imap/scan_folders.rs:112: list_folders() can't get folder: io: timed out: timed out" 2023-12-22T13:07:35.753Z core/event WARNING "" 2 "/__w/deltachat-core-rust/deltachat-core-rust/src/imap/scan_folders.rs:112: list_folders() can't get folder: io: timed out: timed out" 2023-12-22T13:07:35.754Z core/event WARNING "" 2 "/__w/deltachat-core-rust/deltachat-core-rust/src/imap/scan_folders.rs:112: list_folders() can't get folder: io: timed out: timed out" 2023-12-22T13:07:35.754Z core/event WARNING "" 2 "/__w/deltachat-core-rust/deltachat-core-rust/src/imap/scan_folders.rs:112: list_folders() can't get folder: io: timed out: timed out" To avoid busy loop, fail fast on first error and bubble it up instead of trying to recover.
1 parent 865ede3 commit dcf6ffe

File tree

2 files changed

+7
-13
lines changed

2 files changed

+7
-13
lines changed

src/imap.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -994,7 +994,7 @@ impl Imap {
994994
self.prepare(context).await?;
995995

996996
let all_folders = self
997-
.list_folders(context)
997+
.list_folders()
998998
.await
999999
.context("listing folders for resync")?;
10001000
for folder in all_folders {

src/imap/scan_folders.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::{collections::BTreeMap, time::Instant};
22

33
use anyhow::{Context as _, Result};
4-
use futures::stream::StreamExt;
4+
use futures::TryStreamExt;
55

66
use super::{get_folder_meaning_by_attrs, get_folder_meaning_by_name};
77
use crate::config::Config;
@@ -27,7 +27,7 @@ impl Imap {
2727
info!(context, "Starting full folder scan");
2828

2929
self.prepare(context).await?;
30-
let folders = self.list_folders(context).await?;
30+
let folders = self.list_folders().await?;
3131
let watched_folders = get_watched_folders(context).await?;
3232

3333
let mut folder_configs = BTreeMap::new();
@@ -98,21 +98,15 @@ impl Imap {
9898
}
9999

100100
/// Returns the names of all folders on the IMAP server.
101-
pub async fn list_folders(
102-
self: &mut Imap,
103-
context: &Context,
104-
) -> Result<Vec<async_imap::types::Name>> {
101+
pub async fn list_folders(self: &mut Imap) -> Result<Vec<async_imap::types::Name>> {
105102
let session = self.session.as_mut();
106103
let session = session.context("No IMAP connection")?;
107104
let list = session
108105
.list(Some(""), Some("*"))
109106
.await?
110-
.filter_map(|f| async {
111-
f.context("list_folders() can't get folder")
112-
.log_err(context)
113-
.ok()
114-
});
115-
Ok(list.collect().await)
107+
.try_collect()
108+
.await?;
109+
Ok(list)
116110
}
117111
}
118112

0 commit comments

Comments
 (0)