Browse Source

added pooler:rm_group/1 function

Yew-wei Tan 11 years ago
parent
commit
b77d53d794
2 changed files with 52 additions and 5 deletions
  1. 21 1
      src/pooler.erl
  2. 31 4
      test/pooler_tests.erl

+ 21 - 1
src/pooler.erl

@@ -39,7 +39,8 @@
          manual_start/0,
          new_pool/1,
          pool_child_spec/1,
-         rm_pool/1]).
+         rm_pool/1,
+         rm_group/1]).
 
 %% ------------------------------------------------------------------
 %% gen_server Function Exports
@@ -120,6 +121,25 @@ new_pool(PoolConfig) ->
 rm_pool(PoolName) ->
     pooler_sup:rm_pool(PoolName).
 
+%% @doc
+-spec rm_group(atom()) -> ok.
+rm_group(GroupName) ->
+    case pg2:get_local_members(GroupName) of
+        {error, {no_such_group, GroupName}} ->
+            ok;
+        Pools ->
+            rm_group_members(Pools),
+            pg2:delete(GroupName)
+    end.
+
+rm_group_members(MemberPids) ->
+    lists:foreach(
+      fun(MemberPid) ->
+              Pool = gen_server:call(MemberPid, dump_pool),
+              pooler_sup:rm_pool(Pool#pool.name)
+      end,
+      MemberPids).
+
 %% @doc Get child spec described by the proplist `PoolConfig'.
 %%
 %% See {@link pooler:new_pool/1} for info about `PoolConfig'.

+ 31 - 4
test/pooler_tests.erl

@@ -448,8 +448,7 @@ pooler_groups_test_() ->
       {"return error_no_member to group",
        fun() ->
                ?assertEqual(ok, pooler:return_group_member(group_1, error_no_members))
-       end},
-      
+       end},      
 
       {"exhaust pools in group",
        fun() ->
@@ -465,9 +464,37 @@ pooler_groups_test_() ->
                 error_no_members,
                 error_no_members] = [ pooler:take_group_member(group_1)
                                       || _I <- lists:seq(1, 3) ]
-       end}
-     ]}}.
+       end},
+
+      {"rm_group with nonexisting group",
+       fun() ->
+               ?assertEqual(ok, pooler:rm_group(i_dont_exist))
+       end},
+      
+      {"rm_group with existing group",
+       fun() ->
+               %% Group exists to begin with
+               MemberPid = pooler:take_group_member(group_1),
+               ?assert(is_pid(MemberPid)),
+               pooler:return_group_member(group_1, MemberPid),
+
+               Pool1Pid = pooler:take_member(test_pool_1),
+               ?assert(is_pid(Pool1Pid)),
+               pooler:return_member(test_pool_1, Pool1Pid),
+
+               Pool2Pid = pooler:take_member(test_pool_2),
+               ?assert(is_pid(Pool2Pid)),
+               pooler:return_member(test_pool_2, Pool2Pid),
+
+               %% Delete and verify that group and pools are destroyed
+               ?assertEqual(ok, pooler:rm_group(group_1)),
                
+               ?assertExit({noproc, _}, pooler:take_member(test_pool_1)),
+               ?assertExit({noproc, _}, pooler:take_member(test_pool_2)),
+               ?assertEqual({error_no_group, group_1},
+                            pooler:take_group_member(group_1))
+       end}
+     ]}}.          
 
 pooler_limit_failed_adds_test_() ->
     %% verify that pooler crashes completely if too many failures are