http timeout config (#307)
authorfloatingghost <hannah@coffee-and-dreams.uk>
Thu, 24 Nov 2022 12:27:16 +0000 (12:27 +0000)
committerfloatingghost <hannah@coffee-and-dreams.uk>
Thu, 24 Nov 2022 12:27:16 +0000 (12:27 +0000)
Ref https://meta.akkoma.dev/t/increase-timeout-on-libretranslate-request-how/156/2

Co-authored-by: FloatingGhost <hannah@coffee-and-dreams.uk>
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma/pulls/307

CHANGELOG.md
config/config.exs
config/description.exs
docs/docs/configuration/cheatsheet.md
lib/pleroma/http/adapter_helper/default.ex
test/pleroma/http/adapter_helper_test.exs

index 781fbe6e5c27f31a7903003ac1d1b0e5c4d31038..cbf1ac832dbc4d98d37e31b4b1295e578b80ee3e 100644 (file)
@@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 
 ## Unreleased
 
+## Added
+- Config: HTTP timeout options, :pool\_timeout and :receive\_timeout
+
 ## Changed
 - MastoAPI: Accept BooleanLike input on `/api/v1/accounts/:id/follow` (fixes follows with mastodon.py)
 
index 5278896f1d77f49252fd146f5c6e5971d2c83136..04fcd4964754058904b39fc462e9d7349ac8c065 100644 (file)
@@ -180,6 +180,8 @@ config :tesla, :adapter, {Tesla.Adapter.Finch, name: MyFinch}
 
 # Configures http settings, upstream proxy etc.
 config :pleroma, :http,
+  pool_timeout: :timer.seconds(5),
+  receive_timeout: :timer.seconds(15),
   proxy_url: nil,
   user_agent: :default,
   adapter: []
index 994bb7280a72a9b2cebaa8b56af7946811443674..fc10cbf8107a8d41617bf6c67c0c062805c8084d 100644 (file)
@@ -2658,6 +2658,21 @@ config :pleroma, :config_description, [
     type: :group,
     description: "HTTP settings",
     children: [
+      %{
+        key: :pool_timeout,
+        label: "HTTP Pool Request Timeout",
+        type: :integer,
+        description: "Timeout for initiating HTTP requests (in ms, default 5000)",
+        suggestions: [5000]
+      },
+      %{
+        key: :receive_timeout,
+        label: "HTTP Receive Timeout",
+        type: :integer,
+        description:
+          "Timeout for waiting on remote servers to respond to HTTP requests (in ms, default 15000)",
+        suggestions: [15000]
+      },
       %{
         key: :proxy_url,
         label: "Proxy URL",
index ee35d95bcf5d4509472baf61f657e399474b613e..94c32f2a83e9f498a0a7861bf36a70d7c705f82f 100644 (file)
@@ -523,6 +523,8 @@ Available caches:
 
 ### :http
 
+* `receive_timeout`: the amount of time, in ms, to wait for a remote server to respond to a request. (default: `15000`)
+* `pool_timeout`: the amount of time, in ms, to wait to check out an HTTP connection from the pool. This likely does not need changing unless your instance is _very_ busy with outbound requests. (default `5000`)
 * `proxy_url`: an upstream proxy to fetch posts and/or media with, (default: `nil`); for example `http://127.0.0.1:3192`. Does not support SOCKS5 proxy, only http(s).
 * `send_user_agent`: should we include a user agent with HTTP requests? (default: `true`)
 * `user_agent`: what user agent should we use? (default: `:default`), must be string or `:default`
index 6305368718a33b7f805a4cc5285f996ddc3cc246..fc377b3762c36918a2a5c445a250ba69acc06511 100644 (file)
@@ -10,7 +10,13 @@ defmodule Pleroma.HTTP.AdapterHelper.Default do
   @spec options(keyword(), URI.t()) :: keyword()
   def options(opts, _uri) do
     proxy = Pleroma.Config.get([:http, :proxy_url])
-    AdapterHelper.maybe_add_proxy(opts, AdapterHelper.format_proxy(proxy))
+    pool_timeout = Pleroma.Config.get([:http, :pool_timeout], 5000)
+    receive_timeout = Pleroma.Config.get([:http, :receive_timeout], 15_000)
+
+    opts
+    |> AdapterHelper.maybe_add_proxy(AdapterHelper.format_proxy(proxy))
+    |> Keyword.put(:pool_timeout, pool_timeout)
+    |> Keyword.put(:receive_timeout, receive_timeout)
   end
 
   @spec get_conn(URI.t(), keyword()) :: {:ok, keyword()}
index 55ffe4921543cb11a2aae6dce35135ecb29aec14..ba09f3422ba07095994b3108c583cc9f53ce50a6 100644 (file)
@@ -3,8 +3,7 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.HTTP.AdapterHelperTest do
-  use ExUnit.Case, async: true
-
+  use Pleroma.DataCase, async: true
   alias Pleroma.HTTP.AdapterHelper
 
   describe "format_proxy/1" do
@@ -47,4 +46,24 @@ defmodule Pleroma.HTTP.AdapterHelperTest do
              ]
     end
   end
+
+  describe "timeout settings" do
+    test "should default to 5000/15000" do
+      options = AdapterHelper.options(%URI{host: 'somewhere'})
+      assert options[:pool_timeout] == 5000
+      assert options[:receive_timeout] == 15_000
+    end
+
+    test "pool_timeout should be overridden by :http, :pool_timeout" do
+      clear_config([:http, :pool_timeout], 10_000)
+      options = AdapterHelper.options(%URI{host: 'somewhere'})
+      assert options[:pool_timeout] == 10_000
+    end
+
+    test "receive_timeout should be overridden by :http, :receive_timeout" do
+      clear_config([:http, :receive_timeout], 20_000)
+      options = AdapterHelper.options(%URI{host: 'somewhere'})
+      assert options[:receive_timeout] == 20_000
+    end
+  end
 end