From dcac8adb3de7fb5545f6c6f18c9e1d5d82606594 Mon Sep 17 00:00:00 2001
From: FloatingGhost <hannah@coffee-and-dreams.uk>
Date: Fri, 16 Dec 2022 18:33:00 +0000
Subject: [PATCH] Add option to modify HTTP pool size

---
 CHANGELOG.md                                   | 1 +
 config/config.exs                              | 1 +
 config/description.exs                         | 7 +++++++
 lib/pleroma/application.ex                     | 2 ++
 lib/pleroma/config/transfer_task.ex            | 4 +++-
 lib/pleroma/http/adapter_helper.ex             | 7 +++++++
 test/instance_static/emoji/dump_pack/pack.json | 6 ------
 test/pleroma/http/adapter_helper_test.exs      | 7 +++++++
 8 files changed, 28 insertions(+), 7 deletions(-)
 delete mode 100644 test/instance_static/emoji/dump_pack/pack.json

diff --git a/CHANGELOG.md b/CHANGELOG.md
index c69eb4c82..6dcbc4b14 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 
 ### Added
 - Prometheus metrics exporting from `/api/v1/akkoma/metrics`
+- Ability to alter http pool size
 
 ### Removed
 - Non-finch HTTP adapters
diff --git a/config/config.exs b/config/config.exs
index 4c39d52b3..48290fb05 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -179,6 +179,7 @@
   receive_timeout: :timer.seconds(15),
   proxy_url: nil,
   user_agent: :default,
+  pool_size: 50,
   adapter: []
 
 config :pleroma, :instance,
diff --git a/config/description.exs b/config/description.exs
index 1059039e7..eb61c7218 100644
--- a/config/description.exs
+++ b/config/description.exs
@@ -2661,6 +2661,13 @@
           "What user agent to use. Must be a string or an atom `:default`. Default value is `:default`.",
         suggestions: ["Pleroma", :default]
       },
+      %{
+        key: :pool_size,
+        type: :integer,
+        description:
+          "Number of concurrent outbound HTTP requests to allow. Default 50.",
+        suggestions: [50]
+      },
       %{
         key: :adapter,
         type: :keyword,
diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex
index 02336d6d1..26b500dc8 100644
--- a/lib/pleroma/application.ex
+++ b/lib/pleroma/application.ex
@@ -259,10 +259,12 @@ def limiters_setup do
   defp http_children do
     proxy_url = Config.get([:http, :proxy_url])
     proxy = Pleroma.HTTP.AdapterHelper.format_proxy(proxy_url)
+    pool_size = Config.get([:http, :pool_size])
 
     config =
       [:http, :adapter]
       |> Config.get([])
+      |> Pleroma.HTTP.AdapterHelper.add_pool_size(pool_size)
       |> Pleroma.HTTP.AdapterHelper.maybe_add_proxy_pool(proxy)
       |> Keyword.put(:name, MyFinch)
 
diff --git a/lib/pleroma/config/transfer_task.ex b/lib/pleroma/config/transfer_task.ex
index 2e4bcb0ee..4fcaab4a5 100644
--- a/lib/pleroma/config/transfer_task.ex
+++ b/lib/pleroma/config/transfer_task.ex
@@ -25,7 +25,9 @@ defp reboot_time_subkeys,
     do: [
       {:pleroma, Pleroma.Captcha, [:seconds_valid]},
       {:pleroma, Pleroma.Upload, [:proxy_remote]},
-      {:pleroma, :instance, [:upload_limit]}
+      {:pleroma, :instance, [:upload_limit]},
+      {:pleroma, :http, [:pool_size]},
+      {:pleroma, :http, [:proxy_url]}
     ]
 
   def start_link(restart_pleroma? \\ true) do
diff --git a/lib/pleroma/http/adapter_helper.ex b/lib/pleroma/http/adapter_helper.ex
index 77b854b5d..e5da3ffa8 100644
--- a/lib/pleroma/http/adapter_helper.ex
+++ b/lib/pleroma/http/adapter_helper.ex
@@ -47,6 +47,13 @@ def maybe_add_proxy_pool(opts, proxy) do
     |> put_in([:pools, :default, :conn_opts, :proxy], proxy)
   end
 
+  def add_pool_size(opts, pool_size) do
+    opts
+    |> maybe_add_pools()
+    |> maybe_add_default_pool()
+    |> put_in([:pools, :default, :size], pool_size)
+  end
+
   defp maybe_add_pools(opts) do
     if Keyword.has_key?(opts, :pools) do
       opts
diff --git a/test/instance_static/emoji/dump_pack/pack.json b/test/instance_static/emoji/dump_pack/pack.json
deleted file mode 100644
index 3ca753be0..000000000
--- a/test/instance_static/emoji/dump_pack/pack.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-"files": { },
-"pack": {
-"description": "Dump pack", "homepage": "https://pleroma.social",
-"license": "Test license", "share-files": true
-}}
diff --git a/test/pleroma/http/adapter_helper_test.exs b/test/pleroma/http/adapter_helper_test.exs
index ba09f3422..cd7491e9a 100644
--- a/test/pleroma/http/adapter_helper_test.exs
+++ b/test/pleroma/http/adapter_helper_test.exs
@@ -66,4 +66,11 @@ test "receive_timeout should be overridden by :http, :receive_timeout" do
       assert options[:receive_timeout] == 20_000
     end
   end
+
+  describe "pool size settings" do
+    test "should get set" do
+      options = AdapterHelper.add_pool_size([], 50)
+      assert options[:pools][:default][:size] == 50
+    end
+  end
 end