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

Handle edge case of empty group in take_group_member

This shouldn't happen, but seems worth protecting against since it
doesn't add much complexity.
Seth Falcon 12 лет назад
Родитель
Сommit
1fe38ff905
2 измененных файлов с 15 добавлено и 7 удалено
  1. 5 3
      src/pooler.erl
  2. 10 4
      test/pooler_tests.erl

+ 5 - 3
src/pooler.erl

@@ -82,11 +82,13 @@ take_member(PoolName) when is_atom(PoolName) orelse is_pid(PoolName) ->
 %% `GroupName'. Returns `MemberPid' or `error_no_members'.  If no
 %% members are available in the randomly chosen pool, all other pools
 %% in the group are tried in order.
--spec take_group_member(atom()) -> pid() | error_no_members.
+-spec take_group_member(atom()) -> pid() | error_no_members | {error_no_group, atom()}.
 take_group_member(GroupName) ->
     case pg2:get_local_members(GroupName) of
-        {error, {no_such_group, GroupName}} = Error ->
-            Error;
+        {error, {no_such_group, GroupName}} ->
+            {error_no_group, GroupName};
+        [] ->
+            error_no_members;
         Pools ->
             %% Put a random member at the front of the list and then
             %% return the first member you can walking the list.

+ 10 - 4
test/pooler_tests.erl

@@ -120,7 +120,6 @@ pooler_basics_test_() ->
                         {pooled_gs, start_link, [{"type-0"}]}}]],
              application:set_env(pooler, pools, Pools),
              error_logger:delete_report_handler(error_logger_tty_h),
-             application:start(crypto),
              application:start(pooler)
      end,
      fun(_X) ->
@@ -310,12 +309,12 @@ pooler_groups_test_() ->
                      ],
              application:set_env(pooler, pools, Pools),
              %% error_logger:delete_report_handler(error_logger_tty_h),
-             application:start(crypto),
              pg2:start(),
              application:start(pooler)
      end,
      fun(_X) ->
-             application:stop(pooler)
+             application:stop(pooler),
+             application:stop(pg2)
      end,
      [
       {"take and return one group member (repeated)",
@@ -336,7 +335,7 @@ pooler_groups_test_() ->
 
       {"take member from unknown group",
        fun() ->
-               ?assertEqual({error, {no_such_group, not_a_group}},
+               ?assertEqual({error_no_group, not_a_group},
                             pooler:take_group_member(not_a_group))
        end},
 
@@ -352,6 +351,13 @@ pooler_groups_test_() ->
                ?assertEqual(ok, pooler:return_group_member(group_1, Pid))
        end},
 
+      {"take member from empty group",
+       fun() ->
+               %% artificially empty group member list
+               [ pg2:leave(group_1, M) || M <- pg2:get_members(group_1) ],
+               ?assertEqual(error_no_members, pooler:take_group_member(group_1))
+       end},
+
       {"return member to group, implied ok",
        fun() ->
                Pid = pooler:take_group_member(group_1),