mirror of
https://github.com/chatmail/core.git
synced 2026-05-07 08:56:30 +03:00
fix: set message download state to Failure on IMAP errors
Previously the message was removed from `download` table, but message bubble was stuck in InProgress state. Now download state is updated by the caller, so it cannot be accidentally skipped.
This commit is contained in:
@@ -146,29 +146,19 @@ pub(crate) async fn download_msg(context: &Context, msg_id: MsgId, imap: &mut Im
|
|||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
if let Some((server_uid, server_folder)) = row {
|
let Some((server_uid, server_folder)) = row else {
|
||||||
match imap
|
|
||||||
.fetch_single_msg(context, &server_folder, server_uid, msg.rfc724_mid.clone())
|
|
||||||
.await
|
|
||||||
{
|
|
||||||
ImapActionResult::RetryLater | ImapActionResult::Failed => {
|
|
||||||
msg.id
|
|
||||||
.update_download_state(context, DownloadState::Failure)
|
|
||||||
.await?;
|
|
||||||
Err(anyhow!("Call download_full() again to try over."))
|
|
||||||
}
|
|
||||||
ImapActionResult::Success => {
|
|
||||||
// update_download_state() not needed as receive_imf() already
|
|
||||||
// set the state and emitted the event.
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// No IMAP record found, we don't know the UID and folder.
|
// No IMAP record found, we don't know the UID and folder.
|
||||||
msg.id
|
return Err(anyhow!("Call download_full() again to try over."));
|
||||||
.update_download_state(context, DownloadState::Failure)
|
};
|
||||||
.await?;
|
|
||||||
Err(anyhow!("Call download_full() again to try over."))
|
match imap
|
||||||
|
.fetch_single_msg(context, &server_folder, server_uid, msg.rfc724_mid.clone())
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
ImapActionResult::RetryLater | ImapActionResult::Failed => {
|
||||||
|
Err(anyhow!("Call download_full() again to try over."))
|
||||||
|
}
|
||||||
|
ImapActionResult::Success => Ok(()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ use self::connectivity::ConnectivityStore;
|
|||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
use crate::contact::{ContactId, RecentlySeenLoop};
|
use crate::contact::{ContactId, RecentlySeenLoop};
|
||||||
use crate::context::Context;
|
use crate::context::Context;
|
||||||
use crate::download::download_msg;
|
use crate::download::{download_msg, DownloadState};
|
||||||
use crate::ephemeral::{self, delete_expired_imap_messages};
|
use crate::ephemeral::{self, delete_expired_imap_messages};
|
||||||
use crate::events::EventType;
|
use crate::events::EventType;
|
||||||
use crate::imap::{FolderMeaning, Imap};
|
use crate::imap::{FolderMeaning, Imap};
|
||||||
@@ -350,6 +350,16 @@ async fn download_msgs(context: &Context, imap: &mut Imap) -> Result<()> {
|
|||||||
for msg_id in msg_ids {
|
for msg_id in msg_ids {
|
||||||
if let Err(err) = download_msg(context, msg_id, imap).await {
|
if let Err(err) = download_msg(context, msg_id, imap).await {
|
||||||
warn!(context, "Failed to download message {msg_id}: {:#}.", err);
|
warn!(context, "Failed to download message {msg_id}: {:#}.", err);
|
||||||
|
|
||||||
|
// Update download state to failure
|
||||||
|
// so it can be retried.
|
||||||
|
//
|
||||||
|
// On success update_download_state() is not needed
|
||||||
|
// as receive_imf() already
|
||||||
|
// set the state and emitted the event.
|
||||||
|
msg_id
|
||||||
|
.update_download_state(context, DownloadState::Failure)
|
||||||
|
.await?;
|
||||||
}
|
}
|
||||||
context
|
context
|
||||||
.sql
|
.sql
|
||||||
|
|||||||
Reference in New Issue
Block a user