
This query is one of the top cost offenders during an instances lifetime. For small instances it was shown to take up 30-50% percent of the total database query time, while for bigger isntaces it still held a spot in the top 3 — alost as or even more expensive overall than timeline queries! The good news is, there’s a cheaper way using the instance table: no need to process each entry, no need to filter NULLs and no need to dedupe. EXPLAIN estimates the cost of the old query as 13272.39 and the cost of the new query as 395.74 for me; i.e. a 33-fold reduction. Results can slightly differ. E.g. we might have an old user predating the instance tables existence and no interaction with since or no instance table entry due to failure to query nodeinfo. Conversely, we might have an instance entry but all known users got deleted since. However, this seems unproblematic in practice and well worth the perf improvment. Given the previous query didn’t exclude unreachable instances neither does the new query.
98 lines
3.3 KiB
Elixir
98 lines
3.3 KiB
Elixir
# Pleroma: A lightweight social networking server
|
|
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
defmodule Pleroma.Web.MastodonAPI.InstanceControllerTest do
|
|
# TODO: Should not need Cachex
|
|
use Pleroma.Web.ConnCase, async: false
|
|
|
|
alias Pleroma.User
|
|
import Pleroma.Factory
|
|
|
|
test "get instance information", %{conn: conn} do
|
|
clear_config([:instance, :languages], ["en", "ja"])
|
|
conn = get(conn, "/api/v1/instance")
|
|
assert result = json_response_and_validate_schema(conn, 200)
|
|
email = Pleroma.Config.get([:instance, :email])
|
|
|
|
thumbnail = Pleroma.Web.Endpoint.url() <> Pleroma.Config.get([:instance, :instance_thumbnail])
|
|
background = Pleroma.Web.Endpoint.url() <> Pleroma.Config.get([:instance, :background_image])
|
|
|
|
# Note: not checking for "max_toot_chars" since it's optional
|
|
assert %{
|
|
"uri" => _,
|
|
"title" => _,
|
|
"description" => _,
|
|
"version" => _,
|
|
"email" => from_config_email,
|
|
"urls" => %{
|
|
"streaming_api" => _
|
|
},
|
|
"stats" => _,
|
|
"thumbnail" => from_config_thumbnail,
|
|
"languages" => ["en", "ja"],
|
|
"registrations" => _,
|
|
"approval_required" => _,
|
|
"poll_limits" => _,
|
|
"upload_limit" => _,
|
|
"avatar_upload_limit" => _,
|
|
"background_upload_limit" => _,
|
|
"banner_upload_limit" => _,
|
|
"background_image" => from_config_background,
|
|
"description_limit" => _
|
|
} = result
|
|
|
|
assert result["pleroma"]["metadata"]["account_activation_required"] != nil
|
|
assert result["pleroma"]["metadata"]["features"]
|
|
assert result["pleroma"]["metadata"]["federation"]
|
|
assert result["pleroma"]["metadata"]["fields_limits"]
|
|
assert result["pleroma"]["vapid_public_key"]
|
|
assert result["pleroma"]["stats"]["mau"] == 0
|
|
|
|
assert email == from_config_email
|
|
assert thumbnail == from_config_thumbnail
|
|
assert background == from_config_background
|
|
end
|
|
|
|
test "get instance stats", %{conn: conn} do
|
|
user = insert(:user, %{local: true})
|
|
|
|
user2 = insert(:user, %{local: true})
|
|
{:ok, _user2} = User.set_activation(user2, false)
|
|
|
|
insert(:user, %{local: false, nickname: "u@peer1.com"})
|
|
insert(:instance, %{domain: "peer1.com"})
|
|
insert(:user, %{local: false, nickname: "u@peer2.com"})
|
|
insert(:instance, %{domain: "peer2.com"})
|
|
|
|
{:ok, _} = Pleroma.Web.CommonAPI.post(user, %{status: "cofe"})
|
|
|
|
Pleroma.Stats.force_update()
|
|
|
|
conn = get(conn, "/api/v1/instance")
|
|
|
|
assert result = json_response_and_validate_schema(conn, 200)
|
|
|
|
stats = result["stats"]
|
|
|
|
assert stats
|
|
assert stats["user_count"] == 1
|
|
assert stats["status_count"] == 1
|
|
assert stats["domain_count"] == 2
|
|
end
|
|
|
|
test "get peers", %{conn: conn} do
|
|
insert(:user, %{local: false, nickname: "u@peer1.com"})
|
|
insert(:instance, %{domain: "peer1.com"})
|
|
insert(:user, %{local: false, nickname: "u@peer2.com"})
|
|
insert(:instance, %{domain: "peer2.com"})
|
|
|
|
Pleroma.Stats.force_update()
|
|
|
|
conn = get(conn, "/api/v1/instance/peers")
|
|
|
|
assert result = json_response_and_validate_schema(conn, 200)
|
|
|
|
assert ["peer1.com", "peer2.com"] == Enum.sort(result)
|
|
end
|
|
end
|