diff options
| -rw-r--r-- | lib/mix/tasks/rm_user.ex | 2 | ||||
| -rw-r--r-- | lib/pleroma/application.ex | 30 | ||||
| -rw-r--r-- | lib/pleroma/object.ex | 6 | ||||
| -rw-r--r-- | lib/pleroma/user.ex | 3 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 2 | ||||
| -rw-r--r-- | test/object_test.exs | 2 | ||||
| -rw-r--r-- | test/user_test.exs | 29 | 
7 files changed, 59 insertions, 15 deletions
diff --git a/lib/mix/tasks/rm_user.ex b/lib/mix/tasks/rm_user.ex index 27521b745..b7c922d6c 100644 --- a/lib/mix/tasks/rm_user.ex +++ b/lib/mix/tasks/rm_user.ex @@ -7,7 +7,7 @@ defmodule Mix.Tasks.RmUser do      Mix.Task.run("app.start")      with %User{local: true} = user <- User.get_by_nickname(nickname) do -      User.delete(user) +      {:ok, _} = User.delete(user)      end    end  end diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex index a89728471..a6b921b45 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -16,14 +16,30 @@ defmodule Pleroma.Application do          supervisor(Pleroma.Web.Endpoint, []),          # Start your own worker by calling: Pleroma.Worker.start_link(arg1, arg2, arg3)          # worker(Pleroma.Worker, [arg1, arg2, arg3]), -        worker(Cachex, [ -          :user_cache, +        worker( +          Cachex,            [ -            default_ttl: 25000, -            ttl_interval: 1000, -            limit: 2500 -          ] -        ]), +            :user_cache, +            [ +              default_ttl: 25000, +              ttl_interval: 1000, +              limit: 2500 +            ] +          ], +          id: :cachex_user +        ), +        worker( +          Cachex, +          [ +            :object_cache, +            [ +              default_ttl: 25000, +              ttl_interval: 1000, +              limit: 2500 +            ] +          ], +          id: :cachex_object +        ),          worker(            Cachex,            [ diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex index 8f96fd8fb..067ecfaf4 100644 --- a/lib/pleroma/object.ex +++ b/lib/pleroma/object.ex @@ -37,7 +37,7 @@ defmodule Pleroma.Object do      else        key = "object:#{ap_id}" -      Cachex.fetch!(:user_cache, key, fn _ -> +      Cachex.fetch!(:object_cache, key, fn _ ->          object = get_by_ap_id(ap_id)          if object do @@ -56,8 +56,8 @@ defmodule Pleroma.Object do    def delete(%Object{data: %{"id" => id}} = object) do      with Repo.delete(object),           Repo.delete_all(Activity.all_non_create_by_object_ap_id_q(id)), -         {:ok, true} <- Cachex.del(:user_cache, "object:#{id}") do -      :ok +         {:ok, true} <- Cachex.del(:object_cache, "object:#{id}") do +      {:ok, object}      end    end  end diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index bb5b91c61..b2f59ab6b 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -295,6 +295,7 @@ defmodule Pleroma.User do    def invalidate_cache(user) do      Cachex.del(:user_cache, "ap_id:#{user.ap_id}")      Cachex.del(:user_cache, "nickname:#{user.nickname}") +    Cachex.del(:user_cache, "user_info:#{user.id}")    end    def get_cached_by_ap_id(ap_id) do @@ -656,7 +657,7 @@ defmodule Pleroma.User do        end      end) -    :ok +    {:ok, user}    end    def html_filter_policy(%User{info: %{"no_rich_text" => true}}) do diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 48ae36ebd..32c14995f 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -273,7 +273,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do        "to" => [user.follower_address, "https://www.w3.org/ns/activitystreams#Public"]      } -    with Object.delete(object), +    with {:ok, _} <- Object.delete(object),           {:ok, activity} <- insert(data, local),           :ok <- maybe_federate(activity),           {:ok, _actor} <- User.decrease_note_count(user) do diff --git a/test/object_test.exs b/test/object_test.exs index 3e398776c..909605560 100644 --- a/test/object_test.exs +++ b/test/object_test.exs @@ -42,7 +42,7 @@ defmodule Pleroma.ObjectTest do        Object.delete(cached_object) -      {:ok, nil} = Cachex.get(:user_cache, "object:#{object.data["id"]}") +      {:ok, nil} = Cachex.get(:object_cache, "object:#{object.data["id"]}")        cached_object = Object.get_cached_by_ap_id(object.data["id"]) diff --git a/test/user_test.exs b/test/user_test.exs index 05da24f8d..7dec3462f 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -511,7 +511,7 @@ defmodule Pleroma.UserTest do      {:ok, _, _} = CommonAPI.favorite(activity.id, follower)      {:ok, _, _} = CommonAPI.repeat(activity.id, follower) -    :ok = User.delete(user) +    {:ok, _} = User.delete(user)      followed = Repo.get(User, followed.id)      follower = Repo.get(User, follower.id) @@ -551,4 +551,31 @@ defmodule Pleroma.UserTest do        assert Pleroma.HTML.Scrubber.TwitterText == User.html_filter_policy(user)      end    end + +  describe "caching" do +    test "invalidate_cache works" do +      user = insert(:user) +      user_info = User.get_cached_user_info(user) + +      User.invalidate_cache(user) + +      {:ok, nil} = Cachex.get(:user_cache, "ap_id:#{user.ap_id}") +      {:ok, nil} = Cachex.get(:user_cache, "nickname:#{user.nickname}") +      {:ok, nil} = Cachex.get(:user_cache, "user_info:#{user.id}") +    end + +    test "User.delete() plugs any possible zombie objects" do +      user = insert(:user) + +      {:ok, _} = User.delete(user) + +      {:ok, cached_user} = Cachex.get(:user_cache, "ap_id:#{user.ap_id}") + +      assert cached_user != user + +      {:ok, cached_user} = Cachex.get(:user_cache, "nickname:#{user.ap_id}") + +      assert cached_user != user +    end +  end  end  | 
