Browse Source

rm_group/1 returns pool names of pools that failed to terminate

Yew-wei Tan 11 years ago
parent
commit
b41d58986e
2 changed files with 26 additions and 8 deletions
  1. 25 7
      src/pooler.erl
  2. 1 1
      test/pooler_tests.erl

+ 25 - 7
src/pooler.erl

@@ -121,23 +121,41 @@ new_pool(PoolConfig) ->
 rm_pool(PoolName) ->
     pooler_sup:rm_pool(PoolName).
 
-%% @doc
--spec rm_group(atom()) -> ok.
+%% @doc Terminates the group and all pools in that group.
+%%
+%% If termination of any member pool fails, `rm_group/1` returns
+%% `{error, {failed_delete_pools, Pools}}`, where `Pools` is a list
+%% of pools that failed to terminate.
+%%
+%% The group is NOT terminated if any member pool did not
+%% successfully terminate.
+%%
+-spec rm_group(atom()) -> ok | {error, {failed_delete_pools, [atom()]}}.
 rm_group(GroupName) ->
     case pg2:get_local_members(GroupName) of
         {error, {no_such_group, GroupName}} ->
             ok;
         Pools ->
-            rm_group_members(Pools),
-            pg2:delete(GroupName)
+            case rm_group_members(Pools) of
+                [] ->
+                    pg2:delete(GroupName);
+                Failures ->
+                    {error, {failed_rm_pools, Failures}}
+            end
     end.
 
+-spec rm_group_members([pid()]) -> [atom()].
 rm_group_members(MemberPids) ->
-    lists:foreach(
-      fun(MemberPid) ->
+    lists:foldl(
+      fun(MemberPid, Acc) ->
               Pool = gen_server:call(MemberPid, dump_pool),
-              pooler_sup:rm_pool(Pool#pool.name)
+              PoolName = Pool#pool.name,
+              case pooler_sup:rm_pool(PoolName) of
+                  ok -> Acc;
+                  _  -> [PoolName | Acc]
+              end
       end,
+      [],
       MemberPids).
 
 %% @doc Get child spec described by the proplist `PoolConfig'.

+ 1 - 1
test/pooler_tests.erl

@@ -506,7 +506,7 @@ pooler_groups_test_() ->
                ?assertExit({noproc, _}, pooler:take_member(test_pool_2)),
                ?assertEqual({error_no_group, group_1},
                             pooler:take_group_member(group_1))
-       end}
+       end}      
      ]}}.          
 
 pooler_limit_failed_adds_test_() ->