]> granicus.if.org Git - ejabberd/commitdiff
Use round-robin algorithm when selecting worker from DB pool
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Sun, 23 Apr 2017 08:54:56 +0000 (11:54 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Sun, 23 Apr 2017 08:54:56 +0000 (11:54 +0300)
src/ejabberd_redis.erl
src/ejabberd_riak_sup.erl
src/ejabberd_sql_sup.erl
src/randoms.erl

index bd85f0ee56ff320cd2828904a2c333b6f41c77c1..7757c6df3599e42d78b7533c126fc8fcae983480 100644 (file)
@@ -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()}.
index f5c8f7e4fe9ea272770f816308e72346d4b3d281..a01f3538a52b0419ec42da4f3d37f5b60e559367 100644 (file)
@@ -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) ->
index 09aceafb4bc033d5774aed417c4b460f0e81732d..d778e32b7775c1c2d6797dcda839e234a7d6996f 100644 (file)
@@ -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) ->
index ea21b4a1d230b7cd606bc5d1111fd9bebbdbd63b..35a5d758068bd5f6ef34933c547c6e0cd52a568e 100644 (file)
@@ -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.