Do not try to redownload the message in case of any error

Since switch to async we don't have spurious "database is busy"
errors anymore. Since an error is irrecoverable in most cases,
we can skip the message. The cost of this is we may
accidentally skip a correct message if I/O fails, but
the advantage is that we are guaranteed to never confuse
irrecoverable error with recoverable one and get stuck in
infinite loop redownloading the same message over and over.
This commit is contained in:
link2xt
2022-11-22 18:33:38 +00:00
parent 0248a36561
commit afb7f89722
6 changed files with 34 additions and 83 deletions

View File

@@ -1364,7 +1364,9 @@ impl Imap {
/// Fetches a list of messages by server UID.
///
/// Returns the last uid fetch successfully and the info about each downloaded message.
/// Returns the last UID fetched successfully and the info about each downloaded message.
/// If the message is incorrect or there is a failure to write a message to the database,
/// it is skipped and the error is logged.
pub(crate) async fn fetch_many_msgs(
&mut self,
context: &Context,
@@ -1474,12 +1476,12 @@ impl Imap {
if let Some(m) = received_msg {
received_msgs.push(m);
}
last_uid = Some(server_uid)
}
Err(err) => {
warn!(context, "receive_imf error: {:#}", err);
}
};
last_uid = Some(server_uid)
}
}