From 868b6fb8ea12f8cd5f348e55640bca40151d3d17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20S=C3=B6derqvist?= Date: Thu, 17 Sep 2020 17:39:33 +0200 Subject: [PATCH] Retry when pool is full Fixes adrienmo#28 and obsoletes PR adrienmo#29. Retry is implemented for query, but not for query_noreply. Perhaps it should. --- src/eredis_cluster.erl | 5 +++++ src/eredis_cluster_pool_worker.erl | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/eredis_cluster.erl b/src/eredis_cluster.erl index 5420458..5051077 100644 --- a/src/eredis_cluster.erl +++ b/src/eredis_cluster.erl @@ -372,6 +372,7 @@ query_noreply(Command, PoolKey) -> Transaction = fun(Worker) -> qw_noreply(Worker, Command) end, {Pool, _Version} = eredis_cluster_monitor:get_pool_by_slot(Slot), eredis_cluster_pool:transaction(Pool, Transaction), + %% TODO: Retry if pool is full? ok. query(_, _, ?REDIS_CLUSTER_REQUEST_TTL) -> @@ -407,6 +408,10 @@ handle_transaction_result(Result, Version) -> {error, tcp_closed} -> retry; + %% Pool is full + {error, full} -> + retry; + %% Other TCP issues %% See reasons: https://erlang.org/doc/man/inet.html#type-posix {error, Reason} when is_atom(Reason) -> diff --git a/src/eredis_cluster_pool_worker.erl b/src/eredis_cluster_pool_worker.erl index 4c42d26..77fad43 100644 --- a/src/eredis_cluster_pool_worker.erl +++ b/src/eredis_cluster_pool_worker.erl @@ -36,6 +36,8 @@ init(Args) -> {ok, #state{conn=Conn}}. +query(full, _Commands) -> + {error, full}; query(Worker, Commands) -> gen_server:call(Worker, {'query', Commands}).