From ebc6860f838c551405730cf3d2f8544680957078 Mon Sep 17 00:00:00 2001 From: Andrew Plaza Date: Mon, 16 Dec 2024 17:52:09 -0500 Subject: [PATCH] dont err if intent was already published --- xmtp_mls/src/groups/mls_sync.rs | 20 +++++++++++-------- .../storage/encrypted_store/group_intent.rs | 20 +++++++++++++++---- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/xmtp_mls/src/groups/mls_sync.rs b/xmtp_mls/src/groups/mls_sync.rs index dc2d46d2d..630f93af8 100644 --- a/xmtp_mls/src/groups/mls_sync.rs +++ b/xmtp_mls/src/groups/mls_sync.rs @@ -1633,16 +1633,20 @@ pub(crate) mod tests { let amal_group_a: Arc> = Arc::new(amal_a.create_group(None, Default::default()).unwrap()); - for _ in 0..500 { + let conn = amal_a.context().store().conn().unwrap(); + let provider: Arc = Arc::new(conn.into()); + + // create group intent + amal_group_a.sync().await.unwrap(); + assert_eq!(provider.conn_ref().intents_deleted(), 1); + + for _ in 0..100 { let s = xmtp_common::rand_string::<100>(); amal_group_a.send_message_optimistic(s.as_bytes()).unwrap(); } - let conn = amal_a.context().store().conn().unwrap(); - let provider: Arc = Arc::new(conn.into()); - let mut set = tokio::task::JoinSet::new(); - for _ in 0..100 { + for _ in 0..50 { let g = amal_group_a.clone(); let p = provider.clone(); set.spawn(async move { g.publish_intents(&p).await }); @@ -1655,9 +1659,9 @@ pub(crate) mod tests { }); let published = provider.conn_ref().intents_published(); - assert_eq!(published, 501); - // let created = provider.conn_ref().intents_created(); - // assert_eq!(created, 501); + assert_eq!(published, 101); + let created = provider.conn_ref().intents_created(); + assert_eq!(created, 101); if !errs.is_empty() { panic!("Errors during publish"); } diff --git a/xmtp_mls/src/storage/encrypted_store/group_intent.rs b/xmtp_mls/src/storage/encrypted_store/group_intent.rs index 40db6fd6c..bfb3c1399 100644 --- a/xmtp_mls/src/storage/encrypted_store/group_intent.rs +++ b/xmtp_mls/src/storage/encrypted_store/group_intent.rs @@ -214,10 +214,22 @@ impl DbConnection { })?; match res { - // If nothing matched the query, return an error. Either ID or state was wrong - 0 => Err(StorageError::NotFound(format!( - "ToPublish intent {intent_id} for publish" - ))), + // If nothing matched the query, check if its already published, otherwise return an error. Either ID or state was wrong + 0 => { + let already_published = self.raw_query(|conn| { + dsl::group_intents + .filter(dsl::id.eq(intent_id)) + .first::(conn) + }); + + if already_published.is_ok() { + Ok(()) + } else { + Err(StorageError::NotFound(format!( + "Published intent {intent_id} for commit" + ))) + } + } _ => Ok(()), } }