diff --git a/src/chat.rs b/src/chat.rs index be163f421..ff35944d8 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -2439,7 +2439,7 @@ async fn create_send_msg_job(context: &Context, msg_id: MsgId) -> Result Ok(res), Err(err) => { - message::set_msg_failed(context, msg_id, &err.to_string()).await; + message::set_msg_failed(context, msg_id, &err.to_string()).await?; Err(err) } }?; @@ -2451,7 +2451,7 @@ async fn create_send_msg_job(context: &Context, msg_id: MsgId) -> Result Result<()> { + let mut msg = Message::load_from_db(context, msg_id).await?; - match context - .sql - .execute( - "UPDATE msgs SET state=?, error=? WHERE id=?;", - (msg.state, error, msg_id), - ) - .await - { - Ok(_) => context.emit_event(EventType::MsgFailed { - chat_id: msg.chat_id, - msg_id, - }), - Err(e) => { - warn!(context, "{:?}", e); - } - } + if msg.state.can_fail() { + msg.state = MessageState::OutFailed; + warn!(context, "{} failed: {}", msg_id, error); + } else { + warn!( + context, + "{} seems to have failed ({}), but state is {}", msg_id, error, msg.state + ) } + + context + .sql + .execute( + "UPDATE msgs SET state=?, error=? WHERE id=?;", + (msg.state, error, msg_id), + ) + .await?; + + context.emit_event(EventType::MsgFailed { + chat_id: msg.chat_id, + msg_id, + }); + + Ok(()) } /// The number of messages assigned to unblocked chats @@ -2284,7 +2282,7 @@ mod tests { update_msg_state(&alice, alice_msg.id, MessageState::OutMdnRcvd).await?; assert_state(&alice, alice_msg.id, MessageState::OutMdnRcvd).await; - set_msg_failed(&alice, alice_msg.id, "badly failed").await; + set_msg_failed(&alice, alice_msg.id, "badly failed").await?; assert_state(&alice, alice_msg.id, MessageState::OutFailed).await; // check incoming message states on receiver side diff --git a/src/mimeparser.rs b/src/mimeparser.rs index 3cd305068..1a5ecbe1e 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -2156,7 +2156,7 @@ async fn handle_ndn( let mut first = true; for msg in msgs { let (msg_id, chat_id, chat_type) = msg?; - set_msg_failed(context, msg_id, &error).await; + set_msg_failed(context, msg_id, &error).await?; if first { // Add only one info msg for all failed messages ndn_maybe_add_info_msg(context, failed, chat_id, chat_type).await?; diff --git a/src/smtp.rs b/src/smtp.rs index 7ae5a737b..ba371da44 100644 --- a/src/smtp.rs +++ b/src/smtp.rs @@ -492,7 +492,9 @@ pub(crate) async fn smtp_send( if let SendResult::Failure(err) = &status { // We couldn't send the message, so mark it as failed - message::set_msg_failed(context, msg_id, &err.to_string()).await; + if let Err(err) = message::set_msg_failed(context, msg_id, &err.to_string()).await { + error!(context, "Failed to mark {msg_id} as failed: {err:#}."); + } } status } @@ -539,7 +541,7 @@ pub(crate) async fn send_msg_to_smtp( ) .await?; if retries > 6 { - message::set_msg_failed(context, msg_id, "Number of retries exceeded the limit.").await; + message::set_msg_failed(context, msg_id, "Number of retries exceeded the limit.").await?; context .sql .execute("DELETE FROM smtp WHERE id=?", (rowid,))