diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/utils.ex | 19 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/pipeline.ex | 3 | 
2 files changed, 21 insertions, 1 deletions
| diff --git a/lib/pleroma/utils.ex b/lib/pleroma/utils.ex index bc0c95332..a446d3ae6 100644 --- a/lib/pleroma/utils.ex +++ b/lib/pleroma/utils.ex @@ -11,6 +11,8 @@ defmodule Pleroma.Utils do      eperm epipe erange erofs espipe esrch estale etxtbsy exdev    )a +  @repo_timeout Pleroma.Config.get([Pleroma.Repo, :timeout], 15_000) +    def compile_dir(dir) when is_binary(dir) do      dir      |> File.ls!() @@ -63,4 +65,21 @@ defmodule Pleroma.Utils do    end    def posix_error_message(_), do: "" + +  @doc """ +  Returns [timeout: integer] suitable for passing as an option to Repo functions. + +  This function detects if the execution was triggered from IEx shell, Mix task, or +  ./bin/pleroma_ctl and sets the timeout to :infinity, else returns the default timeout value. +  """ +  @spec query_timeout() :: [timeout: integer] +  def query_timeout do +    {parent, _, _, _} = Process.info(self(), :current_stacktrace) |> elem(1) |> Enum.fetch!(2) + +    cond do +      parent |> to_string |> String.starts_with?("Elixir.Mix.Task") -> [timeout: :infinity] +      parent == :erl_eval -> [timeout: :infinity] +      true -> [timeout: @repo_timeout] +    end +  end  end diff --git a/lib/pleroma/web/activity_pub/pipeline.ex b/lib/pleroma/web/activity_pub/pipeline.ex index 377eccb92..a0f2e0312 100644 --- a/lib/pleroma/web/activity_pub/pipeline.ex +++ b/lib/pleroma/web/activity_pub/pipeline.ex @@ -7,6 +7,7 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do    alias Pleroma.Config    alias Pleroma.Object    alias Pleroma.Repo +  alias Pleroma.Utils    alias Pleroma.Web.ActivityPub.ActivityPub    alias Pleroma.Web.ActivityPub.MRF    alias Pleroma.Web.ActivityPub.ObjectValidator @@ -24,7 +25,7 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do    @spec common_pipeline(map(), keyword()) ::            {:ok, Activity.t() | Object.t(), keyword()} | {:error, any()}    def common_pipeline(object, meta) do -    case Repo.transaction(fn -> do_common_pipeline(object, meta) end) do +    case Repo.transaction(fn -> do_common_pipeline(object, meta) end, Utils.query_timeout()) do        {:ok, {:ok, activity, meta}} ->          @side_effects.handle_after_transaction(meta)          {:ok, activity, meta} | 
