diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-04-23 11:54:56 +0300 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-04-23 11:54:56 +0300 |
commit | 8770fc98e1c3fb42a3341f64107e77df76b2b7ca (patch) | |
tree | 99e7fcf743dd2b2d3a5fdc0f6e2276d9ee631e34 /src | |
parent | Add 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.erl | 2 | ||||
-rw-r--r-- | src/ejabberd_riak_sup.erl | 7 | ||||
-rw-r--r-- | src/ejabberd_sql_sup.erl | 4 | ||||
-rw-r--r-- | src/randoms.erl | 7 |
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. |