StatusView: Start fetching rich media cards as soon as possible
authorrinpatch <rinpatch@sdf.org>
Wed, 2 Sep 2020 10:44:08 +0000 (13:44 +0300)
committerrinpatch <rinpatch@sdf.org>
Wed, 2 Sep 2020 13:45:54 +0000 (16:45 +0300)
CHANGELOG.md
lib/pleroma/web/mastodon_api/views/status_view.ex

index 4424c060f3d4ccf3ad4a5b45937cc9b901ab12aa..54685cfb8d64c3fe687589978f80fc9569051ad7 100644 (file)
@@ -10,6 +10,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 
 ### Fixed
 - Mastodon API: Search parameter `following` now correctly returns the followings rather than the followers
+- Mastodon API: Timelines hanging for (`number of posts with links * rich media timeout`) in the worst case.
+  Reduced to just rich media timeout.
 
 ## [2.1.0] - 2020-08-28
 
index 01b8bb6bb1b1cfd8ac76adc5f04cb758b84257e2..3fe1967be98bf7d62635f0dc1cb091cfd2886a17 100644 (file)
@@ -23,6 +23,17 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
 
   import Pleroma.Web.ActivityPub.Visibility, only: [get_visibility: 1, visible_for_user?: 2]
 
+  # This is a naive way to do this, just spawning a process per activity
+  # to fetch the preview. However it should be fine considering
+  # pagination is restricted to 40 activities at a time
+  defp fetch_rich_media_for_activities(activities) do
+    Enum.each(activities, fn activity ->
+      spawn(fn ->
+        Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity)
+      end)
+    end)
+  end
+
   # TODO: Add cached version.
   defp get_replied_to_activities([]), do: %{}
 
@@ -80,6 +91,11 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
 
     # To do: check AdminAPIControllerTest on the reasons behind nil activities in the list
     activities = Enum.filter(opts.activities, & &1)
+
+    # Start fetching rich media before doing anything else, so that later calls to get the cards
+    # only block for timeout in the worst case, as opposed to
+    # length(activities_with_links) * timeout
+    fetch_rich_media_for_activities(activities)
     replied_to_activities = get_replied_to_activities(activities)
 
     parent_activities =