Roberto Ostinelli 3 лет назад
Родитель
Сommit
1fc83f69c5
3 измененных файлов с 39 добавлено и 2 удалено
  1. 9 0
      src/syn.erl
  2. 13 0
      src/syn_registry.erl
  3. 17 2
      test/syn_registry_SUITE.erl

+ 9 - 0
src/syn.erl

@@ -31,6 +31,7 @@
 -export([lookup/1]).
 -export([register/2, register/3, register/4]).
 -export([unregister/1, unregister/2]).
+-export([registry_count/1, registry_count/2]).
 
 %% ===================================================================
 %% API
@@ -83,3 +84,11 @@ unregister(Name) ->
 -spec unregister(Scope :: atom(), Name :: any()) -> ok | {error, Reason :: any()}.
 unregister(Scope, Name) ->
     syn_registry:unregister(Scope, Name).
+
+-spec registry_count(Scope :: atom()) -> non_neg_integer().
+registry_count(Scope) ->
+    syn_registry:count(Scope).
+
+-spec registry_count(Scope :: atom(), Node :: node()) -> non_neg_integer().
+registry_count(Scope, Node) ->
+    syn_registry:count(Scope, Node).

+ 13 - 0
src/syn_registry.erl

@@ -32,6 +32,7 @@
 -export([lookup/1]).
 -export([register/2, register/3, register/4]).
 -export([unregister/1, unregister/2]).
+-export([count/1, count/2]).
 
 %% gen_server callbacks
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
@@ -109,6 +110,18 @@ unregister(Scope, Name) ->
             gen_server:call({ProcessName, Node}, {unregister_on_node, Name, Pid})
     end.
 
+-spec count(Scope :: atom()) -> non_neg_integer().
+count(Scope) ->
+    ets:info(syn_backbone:get_table_name(syn_registry_by_name, Scope), size).
+
+-spec count(Scope :: atom(), Node :: node()) -> non_neg_integer().
+count(Scope, Node) ->
+    ets:select_count(syn_backbone:get_table_name(syn_registry_by_name, Scope), [{
+        {{'_', '_'}, '_', '_', '_', Node},
+        [],
+        [true]
+    }]).
+
 %% ===================================================================
 %% Callbacks
 %% ===================================================================

+ 17 - 2
test/syn_registry_SUITE.erl

@@ -337,6 +337,9 @@ three_nodes_register_unregister_and_monitor_default_scope(Config) ->
     undefined = syn:lookup({remote_pid_on, slave_1}),
     undefined = rpc:call(SlaveNode1, syn, lookup, [{remote_pid_on, slave_1}]),
     undefined = rpc:call(SlaveNode2, syn, lookup, [{remote_pid_on, slave_1}]),
+    0 = syn:registry_count(default),
+    0 = syn:registry_count(default, SlaveNode1),
+    0 = syn:registry_count(default, SlaveNode2),
 
     %% register
     ok = syn:register(<<"my proc">>, Pid),
@@ -362,6 +365,10 @@ three_nodes_register_unregister_and_monitor_default_scope(Config) ->
     {PidRemote1, undefined} = syn:lookup({remote_pid_on, slave_1}),
     {PidRemote1, undefined} = rpc:call(SlaveNode1, syn, lookup, [{remote_pid_on, slave_1}]),
     {PidRemote1, undefined} = rpc:call(SlaveNode2, syn, lookup, [{remote_pid_on, slave_1}]),
+    4 = syn:registry_count(default),
+    3 = syn:registry_count(default, node()),
+    1 = syn:registry_count(default, SlaveNode1),
+    0 = syn:registry_count(default, SlaveNode2),
 
     %% re-register to edit meta
     ok = syn:register(<<"my proc with meta">>, PidWithMeta, {meta2, <<"meta2">>}),
@@ -375,6 +382,10 @@ three_nodes_register_unregister_and_monitor_default_scope(Config) ->
     {PidRemote1, added_meta} = syn:lookup({remote_pid_on, slave_1}),
     {PidRemote1, added_meta} = rpc:call(SlaveNode1, syn, lookup, [{remote_pid_on, slave_1}]),
     {PidRemote1, added_meta} = rpc:call(SlaveNode2, syn, lookup, [{remote_pid_on, slave_1}]),
+    4 = syn:registry_count(default),
+    3 = syn:registry_count(default, node()),
+    1 = syn:registry_count(default, SlaveNode1),
+    0 = syn:registry_count(default, SlaveNode2),
 
     %% kill process
     syn_test_suite_helper:kill_process(Pid),
@@ -396,14 +407,18 @@ three_nodes_register_unregister_and_monitor_default_scope(Config) ->
     undefined = syn:lookup({remote_pid_on, slave_1}),
     undefined = rpc:call(SlaveNode1, syn, lookup, [{remote_pid_on, slave_1}]),
     undefined = rpc:call(SlaveNode2, syn, lookup, [{remote_pid_on, slave_1}]),
+    0 = syn:registry_count(default),
+    0 = syn:registry_count(default, node()),
+    0 = syn:registry_count(default, SlaveNode1),
+    0 = syn:registry_count(default, SlaveNode2),
 
-    % clean
+    %% clean
     syn_test_suite_helper:kill_process(PidWithMeta),
 
     %% errors
     {error, undefined} = syn:unregister({invalid_name}),
 
-    %% simulate race condition
+    %% (simulate race condition)
     Pid1 = syn_test_suite_helper:start_process(),
     Pid2 = syn_test_suite_helper:start_process(),
     ok = syn:register(<<"my proc">>, Pid1),