Просмотр исходного кода

Fix rejecting some names.

[closes ostinelli/syn#32]
Roberto Ostinelli 8 лет назад
Родитель
Сommit
0cdcfbf98c
2 измененных файлов с 36 добавлено и 10 удалено
  1. 2 8
      src/syn_groups.erl
  2. 34 2
      test/syn_groups_SUITE.erl

+ 2 - 8
src/syn_groups.erl

@@ -304,16 +304,10 @@ code_change(_OldVsn, State, _Extra) ->
 %% Internal
 %% ===================================================================
 -spec find_by_pid_and_name(Pid :: pid(), Name :: any()) -> Process :: #syn_groups_table{} | undefined.
-find_by_pid_and_name(Pid, Name) when is_tuple(Name) ->
-    i_find_by_pid_and_name(Pid, {'==', '$1', {Name}});
 find_by_pid_and_name(Pid, Name) ->
-    i_find_by_pid_and_name(Pid, {'=:=', '$1', Name}).
-
--spec i_find_by_pid_and_name(Pid :: pid(), NameGuard :: any()) -> Process :: #syn_groups_table{} | undefined.
-i_find_by_pid_and_name(Pid, NameGuard) ->
     %% build match specs
-    MatchHead = #syn_groups_table{name = '$1', pid = '$2', _ = '_'},
-    Guards = [NameGuard, {'=:=', '$2', Pid}],
+    MatchHead = #syn_groups_table{name = Name, pid = Pid, _ = '_'},
+    Guards = [],
     Result = '$_',
     %% select
     case mnesia:dirty_select(syn_groups_table, [{MatchHead, Guards, [Result]}]) of

+ 34 - 2
test/syn_groups_SUITE.erl

@@ -41,7 +41,8 @@
     single_node_multi_call/1,
     single_node_multi_call_when_recipient_crashes/1,
     single_node_meta/1,
-    single_node_callback_on_process_exit/1
+    single_node_callback_on_process_exit/1,
+    single_node_all_keys/1
 ]).
 -export([
     two_nodes_kill/1,
@@ -100,7 +101,8 @@ groups() ->
             single_node_multi_call,
             single_node_multi_call_when_recipient_crashes,
             single_node_meta,
-            single_node_callback_on_process_exit
+            single_node_callback_on_process_exit,
+            single_node_all_keys
         ]},
         {two_nodes_process_groups, [shuffle], [
             two_nodes_kill,
@@ -446,6 +448,36 @@ single_node_callback_on_process_exit(_Config) ->
     %% unregister
     global:unregister_name(syn_process_groups_SUITE_result).
 
+%% covering bug <https://github.com/ostinelli/syn/issues/32>
+single_node_all_keys(_Config) ->
+    %% set schema location
+    application:set_env(mnesia, schema_location, ram),
+    %% start
+    ok = syn:start(),
+    ok = syn:init(),
+    %% start process
+    Pid = syn_test_suite_helper:start_process(),
+    %% join with complex names
+    GroupNames = [
+        "mygroup",
+        <<"mygroup">>,
+        mygroup,
+        {mygroup},
+        {mygroup, 12345},
+        {mygroup, {other, <<"mygroup">>}},
+        [mygroup, {other, <<"mygroup">>}],
+        {mygroup, {other, <<"mygroup">>}, [mygroup, {other, <<"mygroup">>}]}
+    ],
+    F = fun(GroupName) ->
+        ok = syn:join(GroupName, Pid),
+        %% retrieve
+        [Pid] = syn:get_members(GroupName),
+        true = syn:member(Pid, GroupName)
+    end,
+    lists:foreach(F, GroupNames),
+    %% kill process
+    syn_test_suite_helper:kill_process(Pid).
+
 two_nodes_kill(Config) ->
     %% get slave
     SlaveNode = proplists:get_value(slave_node, Config),