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

fix bug with returning worker to pool

Yuriy Zhloba 9 лет назад
Родитель
Сommit
3a958c510b
1 измененных файлов с 14 добавлено и 5 удалено
  1. 14 5
      src/epgsql_pool.erl

+ 14 - 5
src/epgsql_pool.erl

@@ -85,15 +85,25 @@ query(Worker, Stmt, Params, Options) when is_pid(Worker) ->
             {error, timeout}
     end;
 
-query(PoolName, Stmt, Params, Options) ->
+query(PoolName0, Stmt, Params, Options) ->
+    PoolName = epgsql_pool_utils:pool_name_to_atom(PoolName0),
     case get_worker(PoolName) of
-        {ok, Worker} -> query(Worker, Stmt, Params, Options);
+        {ok, Worker} ->
+            try
+                query(Worker, Stmt, Params, Options)
+            catch
+                Err:Reason ->
+                    erlang:raise(Err, Reason, erlang:get_stacktrace())
+            after
+                pooler:return_member(PoolName, Worker, ok)
+            end;
         {error, Reason} -> {error, Reason}
     end.
 
 
 -spec transaction(pool_name(), fun()) -> epgsql:reply() | {error, term()}.
-transaction(PoolName, Fun) ->
+transaction(PoolName0, Fun) ->
+    PoolName = epgsql_pool_utils:pool_name_to_atom(PoolName0),
     case get_worker(PoolName) of
         {ok, Worker} ->
             try
@@ -131,8 +141,7 @@ set_settings(Map) ->
 
 %%% inner functions
 
-get_worker(PoolName0) ->
-    PoolName = epgsql_pool_utils:pool_name_to_atom(PoolName0),
+get_worker(PoolName) ->
     Timeout = epgsql_pool_settings:get(pooler_get_worker_timeout),
     case pooler:take_member(PoolName, Timeout) of
         Worker when is_pid(Worker) -> {ok, Worker};