Browse Source

Merge pull request #2 from seriyps/kill_failed_connections

Return connections to pooler with 'fail' status on exception
Yuri Zhloba 8 years ago
parent
commit
7e4fd2f441
1 changed files with 37 additions and 28 deletions
  1. 37 28
      src/epgsql_pool.erl

+ 37 - 28
src/epgsql_pool.erl

@@ -116,39 +116,30 @@ do_query(Worker, QueryTuple, Options) when is_pid(Worker) ->
     end;
     end;
 do_query(PoolName0, QueryTuple, Options) ->
 do_query(PoolName0, QueryTuple, Options) ->
     PoolName = epgsql_pool_utils:pool_name_to_atom(PoolName0),
     PoolName = epgsql_pool_utils:pool_name_to_atom(PoolName0),
-    case get_worker(PoolName) of
-        {ok, Worker} ->
-            try
-                do_query(Worker, QueryTuple, Options)
-            catch
-                Err:Reason ->
-                    erlang:raise(Err, Reason, erlang:get_stacktrace())
-            after
-                pooler:return_member(PoolName, Worker, ok)
-            end;
-        {error, Reason} -> {error, Reason}
-    end.
+    with_worker(
+      PoolName,
+      fun(Worker) ->
+              do_query(Worker, QueryTuple, Options)
+      end).
 
 
 
 
 -spec transaction(pool_name(), fun()) -> epgsql:reply() | {error, term()}.
 -spec transaction(pool_name(), fun()) -> epgsql:reply() | {error, term()}.
 transaction(PoolName0, Fun) ->
 transaction(PoolName0, Fun) ->
     PoolName = epgsql_pool_utils:pool_name_to_atom(PoolName0),
     PoolName = epgsql_pool_utils:pool_name_to_atom(PoolName0),
-    case get_worker(PoolName) of
-        {ok, Worker} ->
-            try
-                gen_server:call(Worker, {squery, "BEGIN"}),
-                Result = Fun(Worker),
-                gen_server:call(Worker, {squery, "COMMIT"}),
-                Result
-            catch
-                Err:Reason ->
-                    gen_server:call(Worker, {squery, "ROLLBACK"}),
-                    erlang:raise(Err, Reason, erlang:get_stacktrace())
-            after
-                pooler:return_member(PoolName, Worker, ok)
-            end;
-        {error, Reason} -> {error, Reason}
-    end.
+    with_worker(
+      PoolName,
+      fun(Worker) ->
+              try
+                  gen_server:call(Worker, {squery, "BEGIN"}),
+                  Result = Fun(Worker),
+                  gen_server:call(Worker, {squery, "COMMIT"}),
+                  Result
+              catch
+                  Err:Reason ->
+                      gen_server:call(Worker, {squery, "ROLLBACK"}),
+                      erlang:raise(Err, Reason, erlang:get_stacktrace())
+              end
+      end).
 
 
 
 
 -spec get_settings() -> map().
 -spec get_settings() -> map().
@@ -201,6 +192,24 @@ get_worker(PoolName) ->
     end.
     end.
 
 
 
 
+with_worker(PoolName, Fun) ->
+    case get_worker(PoolName) of
+        {ok, Worker} ->
+            Response =
+                try
+                    Fun(Worker)
+                catch
+                    Err:Reason ->
+                        pooler:return_member(PoolName, Worker, fail),
+                        erlang:raise(Err, Reason, erlang:get_stacktrace())
+                end,
+            pooler:return_member(PoolName, Worker, ok),
+            Response;
+        Err ->
+            Err
+    end.
+
+
 -spec all_keys() -> [atom()].
 -spec all_keys() -> [atom()].
 all_keys() ->
 all_keys() ->
     lists:filtermap(fun({_Key, #epgsql_connection_params{}}) -> false;
     lists:filtermap(fun({_Key, #epgsql_connection_params{}}) -> false;