Browse Source

Fix do_return_member to clean up consumer_to_pid mapping

This bit was lost in the refactor.  Clearly, more tests are needed.
Seth Falcon 14 years ago
parent
commit
8b40249c3b
1 changed files with 7 additions and 3 deletions
  1. 7 3
      src/pooler.erl

+ 7 - 3
src/pooler.erl

@@ -286,7 +286,7 @@ take_member(PoolName, From, State) ->
 
 -spec do_return_member(pid(), ok | fail, #state{}) -> #state{}.
 do_return_member(Pid, ok, State = #state{all_members = AllMembers}) ->
-    {PoolName, _CPid, _} = dict:fetch(Pid, AllMembers),
+    {PoolName, CPid, _} = dict:fetch(Pid, AllMembers),
     Pool = dict:fetch(PoolName, State#state.pools),
     #pool{free_pids = Free, in_use_count = NumInUse,
           free_count = NumFree} = Pool,
@@ -294,7 +294,9 @@ do_return_member(Pid, ok, State = #state{all_members = AllMembers}) ->
                       free_count = NumFree + 1},
     State#state{pools = dict:store(PoolName, Pool1, State#state.pools),
                 all_members = dict:store(Pid, {PoolName, free, os:timestamp()},
-                                         AllMembers)};
+                                         AllMembers),
+               consumer_to_pid = cpmap_remove(Pid, CPid,
+                                              State#state.consumer_to_pid)};
 do_return_member(Pid, fail, State = #state{all_members = AllMembers}) ->
     % for the fail case, perhaps the member crashed and was alerady
     % removed, so use find instead of fetch and ignore missing.
@@ -319,7 +321,9 @@ do_return_member(Pid, fail, State = #state{all_members = AllMembers}) ->
 % If `Pid' is the last element in `CPid's pid list, then the `CPid'
 % entry is removed entirely.
 %
--spec cpmap_remove(pid(), pid(), dict()) -> dict().
+-spec cpmap_remove(pid(), pid() | free, dict()) -> dict().
+cpmap_remove(_Pid, free, CPMap) ->
+    CPMap;
 cpmap_remove(Pid, CPid, CPMap) ->
     case dict:find(CPid, CPMap) of
         {ok, Pids0} ->