From: Nutomic <me@nutomic.com>
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/css/themes/%24%7Bthis.props.defaultTheme.unwrap%28%29%7D.css%60%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<Self, LemmyError> {
     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()))