Browse Source

pooler: use pg instead of pg2 with OTP >= 23

Mikael Pettersson 4 years ago
parent
commit
f64f0972a1
2 changed files with 97 additions and 19 deletions
  1. 53 16
      src/pooler.erl
  2. 44 3
      test/pooler_tests.erl

+ 53 - 16
src/pooler.erl

@@ -146,16 +146,12 @@ rm_pool(PoolName) ->
 %%
 -spec rm_group(atom()) -> ok | {error, {failed_rm_pools, [atom()]}}.
 rm_group(GroupName) ->
-    case pg2:get_local_members(GroupName) of
-        {error, {no_such_group, GroupName}} ->
-            ok;
-        Pools ->
-            case rm_group_members(Pools) of
-                [] ->
-                    pg2:delete(GroupName);
-                Failures ->
-                    {error, {failed_rm_pools, Failures}}
-            end
+    Pools = pg_get_local_members(GroupName),
+    case rm_group_members(Pools) of
+        [] ->
+            pg_delete(GroupName);
+        Failures ->
+            {error, {failed_rm_pools, Failures}}
     end.
 
 -spec rm_group_members([pid()]) -> [atom()].
@@ -210,9 +206,7 @@ take_member(PoolName, Timeout) when is_atom(PoolName) orelse is_pid(PoolName) ->
 %% in the group are tried in order.
 -spec take_group_member(atom()) -> pid() | error_no_members.
 take_group_member(GroupName) ->
-    case pg2:get_local_members(GroupName) of
-        {error, {no_such_group, GroupName}} ->
-            error_no_members;
+    case pg_get_local_members(GroupName) of
         [] ->
             error_no_members;
         Pools ->
@@ -341,7 +335,7 @@ init(#pool{}=Pool) ->
     Pool2 = cull_members_from_pool(Pool1),
     {ok, NewPool} = init_members_sync(N, Pool2),
     %% trigger an immediate timeout, handled by handle_info to allow
-    %% us to register with pg2. We use the timeout mechanism to ensure
+    %% us to register with pg. We use the timeout mechanism to ensure
     %% that a server is added to a group only when it is ready to
     %% process messages.
     {ok, NewPool, 0}.
@@ -386,8 +380,8 @@ handle_info(timeout, #pool{group = undefined} = Pool) ->
     %% ignore
     {noreply, Pool};
 handle_info(timeout, #pool{group = Group} = Pool) ->
-    ok = pg2:create(Group),
-    ok = pg2:join(Group, self()),
+    ok = pg_create(Group),
+    ok = pg_join(Group, self()),
     {noreply, Pool};
 handle_info({'DOWN', MRef, process, Pid, Reason}, State) ->
     State1 =
@@ -963,3 +957,46 @@ do_call_free_member(Fun, Pid) ->
         _Class:Reason ->
             {error, Reason}
     end.
+
+-ifdef(OTP_RELEASE). % >= OTP-21
+-if(?OTP_RELEASE >= 23).
+-define(USE_PG_NOT_PG2, true).
+-else.
+-undef(USE_PG_NOT_PG2).
+-endif.
+-else. % < OTP-21
+-undef(USE_PG_NOT_PG2).
+-endif.
+
+-ifdef(USE_PG_NOT_PG2).
+
+pg_get_local_members(GroupName) ->
+  pg:get_local_members(GroupName).
+
+pg_delete(_GroupName) ->
+  ok.
+
+pg_create(_Group) ->
+  ok.
+
+pg_join(Group, Pid) ->
+  pg:join(Group, Pid).
+
+-else.
+
+pg_get_local_members(GroupName) ->
+  case pg2:get_local_members(GroupName) of
+    {error, {no_such_group, GroupName}} -> [];
+    Pids -> Pids
+  end.
+
+pg_delete(GroupName) ->
+  pg2:delete(GroupName).
+
+pg_create(Group) ->
+  pg2:create(Group).
+
+pg_join(Group, Pid) ->
+  pg2:join(Group, Pid).
+
+-endif.

+ 44 - 3
test/pooler_tests.erl

@@ -450,12 +450,12 @@ pooler_groups_test_() ->
                      ],
              application:set_env(pooler, pools, Pools),
              %% error_logger:delete_report_handler(error_logger_tty_h),
-             pg2:start(),
+             pg_start(),
              application:start(pooler)
      end,
      fun(_X) ->
              application:stop(pooler),
-             application:stop(pg2)
+             pg_stop()
      end,
      [
       {"take and return one group member (repeated)",
@@ -500,7 +500,7 @@ pooler_groups_test_() ->
       {"take member from empty group",
        fun() ->
                %% artificially empty group member list
-               [ pg2:leave(group_1, M) || M <- pg2:get_members(group_1) ],
+               [ pg_leave(group_1, M) || M <- pg_get_members(group_1) ],
                ?assertEqual(error_no_members, pooler:take_group_member(group_1))
        end},
 
@@ -1301,3 +1301,44 @@ starting_members(PoolName) ->
 
 dump_pool(PoolName) ->
     gen_server:call(PoolName, dump_pool).
+
+-ifdef(OTP_RELEASE). % >= OTP-21
+-if(?OTP_RELEASE >= 23).
+-define(USE_PG_NOT_PG2, true).
+-else.
+-undef(USE_PG_NOT_PG2).
+-endif.
+-else. % < OTP-21
+-undef(USE_PG_NOT_PG2).
+-endif.
+
+-ifdef(USE_PG_NOT_PG2).
+
+pg_start() ->
+  pg:start(_Scope = 'pg').
+
+pg_stop() ->
+  lists:foreach(fun(Group) -> pg:leave(Group, pg:get_members(Group)) end,
+                pg:which_groups()).
+
+pg_leave(Group, Pid) ->
+  pg:leave(Group, Pid).
+
+pg_get_members(Group) ->
+  pg:get_members(Group).
+
+-else.
+
+pg_start() ->
+  pg2:start().
+
+pg_stop() ->
+  application:stop(pg2).
+
+pg_leave(Group, Pid) ->
+  pg2:leave(Group, Pid).
+
+pg_get_members(Group) ->
+  pg2:get_members(Group).
+
+-endif.