aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/instances
diff options
context:
space:
mode:
authorIvan Tashkinov <ivantashkinov@gmail.com>2019-01-24 19:15:23 +0300
committerIvan Tashkinov <ivantashkinov@gmail.com>2019-01-24 19:15:23 +0300
commit3e9399ec0b498c0c9783ccb0fea9f682c8b9d0ca (patch)
tree9fe891c45283c89fe11e4a53d49a4c91c8fdf52c /lib/pleroma/instances
parent8654a591f08c7d8d5d61f075906f0c6907e877bb (diff)
downloadpleroma-3e9399ec0b498c0c9783ccb0fea9f682c8b9d0ca.tar.gz
[#534] Optimized bulk publish ops to filter on reachability early. `Instance` refactoring.
Diffstat (limited to 'lib/pleroma/instances')
-rw-r--r--lib/pleroma/instances/instance.ex57
1 files changed, 39 insertions, 18 deletions
diff --git a/lib/pleroma/instances/instance.ex b/lib/pleroma/instances/instance.ex
index fe52331a3..a17c8dab1 100644
--- a/lib/pleroma/instances/instance.ex
+++ b/lib/pleroma/instances/instance.ex
@@ -18,12 +18,35 @@ defmodule Pleroma.Instances.Instance do
timestamps()
end
- def update_changeset(struct, params \\ %{}) do
+ defdelegate host(url), to: Instances
+
+ def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:host, :unreachable_since, :reachability_checked_at])
+ |> validate_required([:host])
|> unique_constraint(:host)
end
+ def filter_reachable([]), do: []
+
+ def filter_reachable(urls) when is_list(urls) do
+ hosts =
+ urls
+ |> Enum.map(&(&1 && host(&1)))
+ |> Enum.filter(&(to_string(&1) != ""))
+
+ unreachable_hosts =
+ Repo.all(
+ from(i in Instance,
+ where:
+ i.host in ^hosts and i.unreachable_since <= ^Instances.reachability_time_threshold(),
+ select: i.host
+ )
+ )
+
+ Enum.filter(urls, &(&1 && host(&1) not in unreachable_hosts))
+ end
+
def reachable?(url) when is_binary(url) do
!Repo.one(
from(i in Instance,
@@ -37,13 +60,13 @@ defmodule Pleroma.Instances.Instance do
def reachable?(_), do: true
def set_reachable(url) when is_binary(url) do
- Repo.update_all(
- from(i in Instance, where: i.host == ^host(url)),
- set: [
- unreachable_since: nil,
- reachability_checked_at: DateTime.utc_now()
- ]
- )
+ with host <- host(url),
+ %Instance{} = existing_record <- Repo.get_by(Instance, %{host: host}) do
+ {:ok, _instance} =
+ existing_record
+ |> changeset(%{unreachable_since: nil, reachability_checked_at: DateTime.utc_now()})
+ |> Repo.update()
+ end
end
def set_reachable(_), do: {0, :noop}
@@ -67,19 +90,17 @@ defmodule Pleroma.Instances.Instance do
do: Map.delete(changes, :unreachable_since),
else: changes
- {:ok, _instance} = Repo.update(update_changeset(existing_record, update_changes))
+ {:ok, _instance} =
+ existing_record
+ |> changeset(update_changes)
+ |> Repo.update()
else
- {:ok, _instance} = Repo.insert(update_changeset(%Instance{}, Map.put(changes, :host, host)))
+ {:ok, _instance} =
+ %Instance{}
+ |> changeset(Map.put(changes, :host, host))
+ |> Repo.insert()
end
end
def set_unreachable(_, _), do: {0, :noop}
-
- defp host(url_or_host) do
- if url_or_host =~ ~r/^http/i do
- URI.parse(url_or_host).host
- else
- url_or_host
- end
- end
end