summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-04-23 11:54:56 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-04-23 11:54:56 +0300
commit8770fc98e1c3fb42a3341f64107e77df76b2b7ca (patch)
tree99e7fcf743dd2b2d3a5fdc0f6e2276d9ee631e34 /src
parentAdd clear_cache admin command (diff)
Use round-robin algorithm when selecting worker from DB pool
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_redis.erl2
-rw-r--r--src/ejabberd_riak_sup.erl7
-rw-r--r--src/ejabberd_sql_sup.erl4
-rw-r--r--src/randoms.erl7
4 files changed, 12 insertions, 8 deletions
diff --git a/src/ejabberd_redis.erl b/src/ejabberd_redis.erl
index bd85f0ee..7757c6df 100644
--- a/src/ejabberd_redis.erl
+++ b/src/ejabberd_redis.erl
@@ -516,7 +516,7 @@ log_error(Cmd, Reason) ->
-spec get_rnd_id() -> pos_integer().
get_rnd_id() ->
- randoms:uniform(2, ejabberd_redis_sup:get_pool_size()).
+ randoms:round_robin(ejabberd_redis_sup:get_pool_size() - 1) + 2.
-spec get_result([{error, atom() | binary()} | {ok, iodata()}]) ->
{ok, [redis_reply()]} | {error, binary()}.
diff --git a/src/ejabberd_riak_sup.erl b/src/ejabberd_riak_sup.erl
index f5c8f7e4..a01f3538 100644
--- a/src/ejabberd_riak_sup.erl
+++ b/src/ejabberd_riak_sup.erl
@@ -30,7 +30,7 @@
-author('alexey@process-one.net').
-export([start_link/0, init/1, get_pids/0,
- transform_options/1, get_random_pid/0, get_random_pid/1,
+ transform_options/1, get_random_pid/0,
host_up/1, config_reloaded/0, opt_type/1]).
-include("ejabberd.hrl").
@@ -199,10 +199,7 @@ get_pids() ->
[ejabberd_riak:get_proc(I) || I <- lists:seq(1, get_pool_size())].
get_random_pid() ->
- get_random_pid(p1_time_compat:system_time()).
-
-get_random_pid(Term) ->
- I = erlang:phash2(Term, get_pool_size()) + 1,
+ I = randoms:round_robin(get_pool_size()) + 1,
ejabberd_riak:get_proc(I).
transform_options(Opts) ->
diff --git a/src/ejabberd_sql_sup.erl b/src/ejabberd_sql_sup.erl
index 09aceafb..d778e32b 100644
--- a/src/ejabberd_sql_sup.erl
+++ b/src/ejabberd_sql_sup.erl
@@ -98,7 +98,9 @@ get_pids(Host) ->
get_random_pid(Host) ->
case get_pids(Host) of
[] -> none;
- Pids -> lists:nth(erlang:phash(p1_time_compat:unique_integer(), length(Pids)), Pids)
+ Pids ->
+ I = randoms:round_robin(length(Pids)) + 1,
+ lists:nth(I, Pids)
end.
add_pid(Host, Pid) ->
diff --git a/src/randoms.erl b/src/randoms.erl
index ea21b4a1..35a5d758 100644
--- a/src/randoms.erl
+++ b/src/randoms.erl
@@ -27,7 +27,8 @@
-author('alexey@process-one.net').
--export([get_string/0, uniform/0, uniform/1, uniform/2, bytes/1]).
+-export([get_string/0, uniform/0, uniform/1, uniform/2, bytes/1,
+ round_robin/1]).
-define(THRESHOLD, 16#10000000000000000).
@@ -51,3 +52,7 @@ bytes(N) ->
bytes(N) ->
crypto:rand_bytes(N).
-endif.
+
+-spec round_robin(pos_integer()) -> non_neg_integer().
+round_robin(N) ->
+ erlang:unique_integer([monotonic, positive]) rem N.