Roberto Ostinelli 10 лет назад
Родитель
Сommit
3a3cf79920
3 измененных файлов с 104 добавлено и 4 удалено
  1. 9 0
      src/syn.erl
  2. 15 0
      src/syn_backbone.erl
  3. 80 4
      test/syn_register_processes_SUITE.erl

+ 9 - 0
src/syn.erl

@@ -33,6 +33,7 @@
 -export([register/2, unregister/1]).
 -export([find_by_key/1, find_by_pid/1]).
 -export([options/1]).
+-export([count/0, count/1]).
 
 
 %% ===================================================================
@@ -75,3 +76,11 @@ options(Options) ->
         {send_message, Message} ->
             syn_netsplits:conflicting_mode({send_message, Message})
     end.
+
+-spec count() -> non_neg_integer().
+count() ->
+    syn_backbone:count().
+
+-spec count(Node :: atom()) -> non_neg_integer().
+count(Node) ->
+    syn_backbone:count(Node).

+ 15 - 0
src/syn_backbone.erl

@@ -33,6 +33,7 @@
 -export([start_link/0]).
 -export([register/2, unregister/1]).
 -export([find_by_key/1, find_by_pid/1]).
+-export([count/0, count/1]).
 
 %% gen_server callbacks
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
@@ -95,6 +96,20 @@ unregister(Key) ->
             gen_server:call(?MODULE, {unlink_process, Pid})
     end.
 
+-spec count() -> non_neg_integer().
+count() ->
+    mnesia:table_info(syn_processes_table, size).
+
+-spec count(Node :: atom()) -> non_neg_integer().
+count(Node) ->
+    %% build match specs
+    MatchHead = #syn_processes_table{node = '$2', _ = '_'},
+    Guard = {'=:=', '$2', Node},
+    Result = '$2',
+    %% select
+    Processes = mnesia:dirty_select(syn_processes_table, [{MatchHead, [Guard], [Result]}]),
+    length(Processes).
+
 %% ===================================================================
 %% Callbacks
 %% ===================================================================

+ 80 - 4
test/syn_register_processes_SUITE.erl

@@ -40,11 +40,13 @@
     single_node_when_mnesia_is_ram_find_by_pid/1,
     single_node_when_mnesia_is_ram_re_register_error/1,
     single_node_when_mnesia_is_ram_unregister/1,
-    single_node_when_mnesia_is_disc_find_by_key/1
+    single_node_when_mnesia_is_disc_find_by_key/1,
+    single_node_when_mnesia_is_ram_process_count/1
 ]).
 -export([
     two_nodes_when_mnesia_is_ram_find_by_key/1,
-    two_nodes_when_mnesia_is_disc_find_by_pid/1
+    two_nodes_when_mnesia_is_disc_find_by_pid/1,
+    two_nodes_when_mnesia_is_ram_process_count/1
 ]).
 
 %% include
@@ -87,11 +89,13 @@ groups() ->
             single_node_when_mnesia_is_ram_find_by_pid,
             single_node_when_mnesia_is_ram_re_register_error,
             single_node_when_mnesia_is_ram_unregister,
-            single_node_when_mnesia_is_disc_find_by_key
+            single_node_when_mnesia_is_disc_find_by_key,
+            single_node_when_mnesia_is_ram_process_count
         ]},
         {two_nodes_process_registration, [shuffle], [
             two_nodes_when_mnesia_is_ram_find_by_key,
-            two_nodes_when_mnesia_is_disc_find_by_pid
+            two_nodes_when_mnesia_is_disc_find_by_pid,
+            two_nodes_when_mnesia_is_ram_process_count
         ]}
     ].
 %% -------------------------------------------------------------------
@@ -278,6 +282,31 @@ single_node_when_mnesia_is_disc_find_by_key(_Config) ->
     %% retrieve
     undefined = syn:find_by_key(<<"my proc">>).
 
+single_node_when_mnesia_is_ram_process_count(_Config) ->
+    %% set schema location
+    application:set_env(mnesia, schema_location, ram),
+    %% start
+    ok = syn:start(),
+    %% count
+    0 = syn:count(),
+    %% start process
+    Pid1 = syn_test_suite_helper:start_process(),
+    Pid2 = syn_test_suite_helper:start_process(),
+    Pid3 = syn_test_suite_helper:start_process(),
+    %% register
+    ok = syn:register(1, Pid1),
+    ok = syn:register(2, Pid2),
+    ok = syn:register(3, Pid3),
+    %% count
+    3 = syn:count(),
+    %% kill processes
+    syn_test_suite_helper:kill_process(Pid1),
+    syn_test_suite_helper:kill_process(Pid2),
+    syn_test_suite_helper:kill_process(Pid3),
+    timer:sleep(100),
+    %% count
+    0 = syn:count().
+
 two_nodes_when_mnesia_is_ram_find_by_key(Config) ->
     %% get slave
     SlaveNodeName = proplists:get_value(slave_node_name, Config),
@@ -330,3 +359,50 @@ two_nodes_when_mnesia_is_disc_find_by_pid(Config) ->
     %% retrieve
     undefined = syn:find_by_pid(Pid),
     undefined = rpc:call(SlaveNodeName, syn, find_by_pid, [Pid]).
+
+two_nodes_when_mnesia_is_ram_process_count(Config) ->
+    %% get slave
+    SlaveNodeName = proplists:get_value(slave_node_name, Config),
+    CurrentNode = node(),
+    %% set schema location
+    application:set_env(mnesia, schema_location, ram),
+    rpc:call(SlaveNodeName, mnesia, schema_location, [ram]),
+    %% start
+    ok = syn:start(),
+    ok = rpc:call(SlaveNodeName, syn, start, []),
+    timer:sleep(100),
+    %% count
+    0 = syn:count(),
+    0 = rpc:call(SlaveNodeName, syn, count, []),
+    0 = syn:count(CurrentNode),
+    0 = syn:count(SlaveNodeName),
+    0 = rpc:call(SlaveNodeName, syn, count, [CurrentNode]),
+    0 = rpc:call(SlaveNodeName, syn, count, [SlaveNodeName]),
+    %% start processes
+    PidLocal1 = syn_test_suite_helper:start_process(),
+    PidLocal2 = syn_test_suite_helper:start_process(),
+    PidSlave = syn_test_suite_helper:start_process(SlaveNodeName),
+    %% register
+    ok = syn:register(1, PidLocal1),
+    ok = syn:register(2, PidLocal2),
+    ok = syn:register(3, PidSlave),
+    timer:sleep(100),
+    %% count
+    3 = syn:count(),
+    3 = rpc:call(SlaveNodeName, syn, count, []),
+    2 = syn:count(CurrentNode),
+    1 = syn:count(SlaveNodeName),
+    2 = rpc:call(SlaveNodeName, syn, count, [CurrentNode]),
+    1 = rpc:call(SlaveNodeName, syn, count, [SlaveNodeName]),
+    %% kill processes
+    syn_test_suite_helper:kill_process(PidLocal1),
+    syn_test_suite_helper:kill_process(PidLocal2),
+    syn_test_suite_helper:kill_process(PidSlave),
+    timer:sleep(100),
+    %% count
+    0 = syn:count(),
+    0 = rpc:call(SlaveNodeName, syn, count, []),
+    0 = syn:count(CurrentNode),
+    0 = syn:count(SlaveNodeName),
+    0 = rpc:call(SlaveNodeName, syn, count, [CurrentNode]),
+    0 = rpc:call(SlaveNodeName, syn, count, [SlaveNodeName]).