From 65da01f863bd0642869bf4f73b5e0876af9cd08c Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 22 Oct 2026 16:08:19 +0000 Subject: [PATCH] refactor: create all keyupdates in a single transaction --- src/keyupdate.rs | 29 +++++++++++++++++++---------- src/mimefactory.rs | 17 +++++------------ 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/keyupdate.rs b/src/keyupdate.rs index b7cb63537..4e54c086a 100644 --- a/src/keyupdate.rs +++ b/src/keyupdate.rs @@ -188,16 +188,25 @@ pub(crate) async fn maybe_send_keyupdate_message(context: &Context) -> Result<() } let recipients = keyupdate_recipients(context, KEYUPDATE_MAX_RECIPIENTS).await?; - for chunk in recipients.chunks(KEYUPDATE_CHUNK_CONTACTS) { - let envelope = envelope_recipients(chunk); - let rfc724_mid = create_outgoing_rfc724_mid(); - let keys = chunk.iter().map(|r| r.public_key.clone()).collect(); - let queued_msg = keyupdate_message(context, &rfc724_mid, keys, envelope).await?; - context - .sql - .transaction(|tx| insert_into_smtp(tx, &rfc724_mid, &queued_msg)) - .await?; - } + info!( + context, + "Sending keyupdate messages to {} recipients.", + recipients.len() + ); + let is_bot = context.get_config_bool(Config::Bot).await?; + context + .sql + .transaction(|tx| { + for chunk in recipients.chunks(KEYUPDATE_CHUNK_CONTACTS) { + let envelope = envelope_recipients(chunk); + let rfc724_mid = create_outgoing_rfc724_mid(); + let keys = chunk.iter().map(|r| r.public_key.clone()).collect(); + let queued_msg = keyupdate_message(is_bot, &rfc724_mid, keys, envelope); + insert_into_smtp(tx, &rfc724_mid, &queued_msg)?; + } + Ok(()) + }) + .await?; // Record only after queueing, so failed queueing is retried by a later check. context diff --git a/src/mimefactory.rs b/src/mimefactory.rs index 4c0316536..b23be697d 100644 --- a/src/mimefactory.rs +++ b/src/mimefactory.rs @@ -2381,24 +2381,18 @@ fn keyupdate_body() -> MimePart<'static> { /// Returns a keyupdate message informing the owners of `recipient_keys` /// about the current key and relay list, see [`crate::keyupdate`]. -pub(crate) async fn keyupdate_message( - context: &Context, +pub(crate) fn keyupdate_message( + is_bot: bool, rfc724_mid: &str, recipient_keys: Vec, recipients: Vec, -) -> Result { - info!( - context, - "Sending keyupdate message to {} recipients.", - recipient_keys.len() - ); +) -> QueuedMail { let message = keyupdate_body(); - let is_bot = context.get_config_bool(Config::Bot).await?; let headers = non_chat_headers(is_bot, "Keyupdate"); let message = add_headers_to_encrypted_part(message, headers); - let queued_mail = QueuedMail { + QueuedMail { raw_message: part_to_bytes(message), display_name: String::new(), rfc724_mid: rfc724_mid.to_string(), @@ -2418,8 +2412,7 @@ pub(crate) async fn keyupdate_message( recipients, sent_to: Vec::new(), bcc_self: false, - }; - Ok(queued_mail) + } } /// Renders MIME part into a vector of bytes.