From cffdb06b66233d58f2bee763cc14e4eaba3b6454 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Fri, 16 Feb 2018 20:50:22 +0300 Subject: Cache 'isuser' queries to external auth program --- src/ejabberd_auth.erl | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/ejabberd_auth.erl') diff --git a/src/ejabberd_auth.erl b/src/ejabberd_auth.erl index df75be9eb..03eee9de4 100644 --- a/src/ejabberd_auth.erl +++ b/src/ejabberd_auth.erl @@ -526,7 +526,10 @@ db_get_password(User, Server, Mod) -> UseCache = use_cache(Mod, Server), case erlang:function_exported(Mod, get_password, 2) of false when UseCache -> - ets_cache:lookup(?AUTH_CACHE, {User, Server}); + case ets_cache:lookup(?AUTH_CACHE, {User, Server}) of + {ok, exists} -> error; + Other -> Other + end; false -> error; true when UseCache -> @@ -544,7 +547,20 @@ db_user_exists(User, Server, Mod) -> error -> case Mod:store_type(Server) of external -> - Mod:user_exists(User, Server); + case ets_cache:update( + ?AUTH_CACHE, {User, Server}, {ok, exists}, + fun() -> + case Mod:user_exists(User, Server) of + true -> {ok, exists}; + false -> error; + {error, _} = Err -> Err + end + end, cache_nodes(Mod, Server)) of + {ok, _} -> + true; + error -> + false + end; _ -> false end -- cgit v1.2.3 From ff06bdf144c089c5ff58207877027d96eb45b515 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Sun, 18 Feb 2018 09:02:23 +0300 Subject: Don't ask other nodes to invalidate cache when the key is not updated --- src/ejabberd_auth.erl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/ejabberd_auth.erl') diff --git a/src/ejabberd_auth.erl b/src/ejabberd_auth.erl index 03eee9de4..861d8f37b 100644 --- a/src/ejabberd_auth.erl +++ b/src/ejabberd_auth.erl @@ -547,15 +547,15 @@ db_user_exists(User, Server, Mod) -> error -> case Mod:store_type(Server) of external -> - case ets_cache:update( - ?AUTH_CACHE, {User, Server}, {ok, exists}, + case ets_cache:lookup( + ?AUTH_CACHE, {User, Server}, fun() -> case Mod:user_exists(User, Server) of true -> {ok, exists}; false -> error; {error, _} = Err -> Err end - end, cache_nodes(Mod, Server)) of + end) of {ok, _} -> true; error -> @@ -584,7 +584,7 @@ db_check_password(User, AuthzId, Server, ProvidedPassword, false -> error end - end, cache_nodes(Mod, Server)) of + end) of {ok, _} -> true; error -> -- cgit v1.2.3