mirror of
https://github.com/chatmail/core.git
synced 2026-05-14 20:36:30 +03:00
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.
This commit is contained in:
@@ -994,7 +994,7 @@ impl Imap {
|
|||||||
self.prepare(context).await?;
|
self.prepare(context).await?;
|
||||||
|
|
||||||
let all_folders = self
|
let all_folders = self
|
||||||
.list_folders(context)
|
.list_folders()
|
||||||
.await
|
.await
|
||||||
.context("listing folders for resync")?;
|
.context("listing folders for resync")?;
|
||||||
for folder in all_folders {
|
for folder in all_folders {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use std::{collections::BTreeMap, time::Instant};
|
use std::{collections::BTreeMap, time::Instant};
|
||||||
|
|
||||||
use anyhow::{Context as _, Result};
|
use anyhow::{Context as _, Result};
|
||||||
use futures::stream::StreamExt;
|
use futures::TryStreamExt;
|
||||||
|
|
||||||
use super::{get_folder_meaning_by_attrs, get_folder_meaning_by_name};
|
use super::{get_folder_meaning_by_attrs, get_folder_meaning_by_name};
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
@@ -27,7 +27,7 @@ impl Imap {
|
|||||||
info!(context, "Starting full folder scan");
|
info!(context, "Starting full folder scan");
|
||||||
|
|
||||||
self.prepare(context).await?;
|
self.prepare(context).await?;
|
||||||
let folders = self.list_folders(context).await?;
|
let folders = self.list_folders().await?;
|
||||||
let watched_folders = get_watched_folders(context).await?;
|
let watched_folders = get_watched_folders(context).await?;
|
||||||
|
|
||||||
let mut folder_configs = BTreeMap::new();
|
let mut folder_configs = BTreeMap::new();
|
||||||
@@ -98,21 +98,15 @@ impl Imap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the names of all folders on the IMAP server.
|
/// Returns the names of all folders on the IMAP server.
|
||||||
pub async fn list_folders(
|
pub async fn list_folders(self: &mut Imap) -> Result<Vec<async_imap::types::Name>> {
|
||||||
self: &mut Imap,
|
|
||||||
context: &Context,
|
|
||||||
) -> Result<Vec<async_imap::types::Name>> {
|
|
||||||
let session = self.session.as_mut();
|
let session = self.session.as_mut();
|
||||||
let session = session.context("No IMAP connection")?;
|
let session = session.context("No IMAP connection")?;
|
||||||
let list = session
|
let list = session
|
||||||
.list(Some(""), Some("*"))
|
.list(Some(""), Some("*"))
|
||||||
.await?
|
.await?
|
||||||
.filter_map(|f| async {
|
.try_collect()
|
||||||
f.context("list_folders() can't get folder")
|
.await?;
|
||||||
.log_err(context)
|
Ok(list)
|
||||||
.ok()
|
|
||||||
});
|
|
||||||
Ok(list.collect().await)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user