From: Nutomic Date: Fri, 1 Apr 2022 18:06:23 +0000 (+0000) Subject: Fetch community outbox in parallel (fixes #2180) (#2181) X-Git-Url: http://these/git/%7B%60%24%7BwebArchiveUrl%7D/%22%7B%7D/%22https:/nerdica.net/%7BimageUploadUrl%7D?a=commitdiff_plain;h=589d952a95595760c29f184c6b202dddb6e33380;p=lemmy.git Fetch community outbox in parallel (fixes #2180) (#2181) --- diff --git a/crates/apub/src/collections/community_outbox.rs b/crates/apub/src/collections/community_outbox.rs index f3303406..769e9bb2 100644 --- a/crates/apub/src/collections/community_outbox.rs +++ b/crates/apub/src/collections/community_outbox.rs @@ -10,6 +10,7 @@ use crate::{ }; use activitystreams_kinds::collection::OrderedCollectionType; use chrono::NaiveDateTime; +use futures::future::join_all; use lemmy_api_common::blocking; use lemmy_apub_lib::{ data::Data, @@ -97,7 +98,7 @@ impl ApubObject for ApubCommunityOutbox { async fn from_apub( apub: Self::ApubType, data: &Self::DataType, - request_counter: &mut i32, + _request_counter: &mut i32, ) -> Result { let mut outbox_activities = apub.ordered_items; if outbox_activities.len() > 20 { @@ -108,12 +109,19 @@ impl ApubObject for ApubCommunityOutbox { // Lemmy versions, or from other software which we cant parse. In that case, we simply skip the // item and only parse the ones that work. let data = Data::new(data.1.clone()); - for activity in outbox_activities { - let verify = activity.verify(&data, request_counter).await; - if verify.is_ok() { - activity.receive(&data, request_counter).await.ok(); + // process items in parallel, to avoid long delay from fetch_site_metadata() and other processing + join_all(outbox_activities.into_iter().map(|activity| { + async { + // use separate request counter for each item, otherwise there will be problems with + // parallel processing + let request_counter = &mut 0; + let verify = activity.verify(&data, request_counter).await; + if verify.is_ok() { + activity.receive(&data, request_counter).await.ok(); + } } - } + })) + .await; // This return value is unused, so just set an empty vec Ok(ApubCommunityOutbox(Vec::new()))