From: Vsevolod Stakhov Date: Sun, 12 Sep 2021 11:39:57 +0000 (+0100) Subject: [Minor] Redis_pool: Slightly improve style X-Git-Tag: 3.1~174 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=138b68aa5a49d96cd913cad0a563eeec84d019fc;p=thirdparty%2Frspamd.git [Minor] Redis_pool: Slightly improve style --- diff --git a/src/libserver/redis_pool.cxx b/src/libserver/redis_pool.cxx index a3c5a7ebb2..84e101105d 100644 --- a/src/libserver/redis_pool.cxx +++ b/src/libserver/redis_pool.cxx @@ -96,6 +96,7 @@ class redis_pool_elt { */ std::list active; std::list inactive; + std::list terminating; std::string ip; std::string db; std::string password; @@ -121,19 +122,31 @@ public: auto new_connection() -> redisAsyncContext *; - auto release_active(const redis_pool_connection *conn) -> void + auto release_connection(const redis_pool_connection *conn) -> void { - active.erase(conn->elt_pos); + switch(conn->state) { + case RSPAMD_REDIS_POOL_CONN_ACTIVE: + active.erase(conn->elt_pos); + break; + case RSPAMD_REDIS_POOL_CONN_INACTIVE: + inactive.erase(conn->elt_pos); + break; + case RSPAMD_REDIS_POOL_CONN_FINALISING: + terminating.erase(conn->elt_pos); + break; + } } - auto release_inactive(const redis_pool_connection *conn) -> void + auto move_to_inactive(redis_pool_connection *conn) -> void { - inactive.erase(conn->elt_pos); + inactive.splice(std::end(inactive), active, conn->elt_pos); + conn->elt_pos = std::prev(std::end(inactive)); } - auto move_to_inactive(const redis_pool_connection *conn) -> void + auto move_to_terminating(redis_pool_connection *conn) -> void { - inactive.splice(std::end(inactive), active, conn->elt_pos); + inactive.splice(std::end(inactive), terminating, conn->elt_pos); + conn->elt_pos = std::prev(std::end(terminating)); } inline static auto make_key(const gchar *db, const gchar *password, @@ -308,6 +321,7 @@ redis_pool_connection::redis_conn_timeout_cb(EV_P_ ev_timer *w, int revents) -> conn->state = RSPAMD_REDIS_POOL_CONN_FINALISING; ev_timer_again(EV_A_ w); redisAsyncCommand(conn->ctx, redis_pool_connection::redis_quit_cb, conn, "QUIT"); + conn->elt->move_to_terminating(conn); } else { /* Finalising by timeout */ @@ -316,7 +330,7 @@ redis_pool_connection::redis_conn_timeout_cb(EV_P_ ev_timer *w, int revents) -> conn->ctx); /* Erasure of shared pointer will cause it to be removed */ - conn->elt->release_inactive(conn); + conn->elt->release_connection(conn); } } @@ -338,7 +352,7 @@ redis_pool_connection::redis_on_disconnect(const struct redisAsyncContext *ac, i } /* Erasure of shared pointer will cause it to be removed */ - conn->elt->release_inactive(conn); + conn->elt->release_connection(conn); } } @@ -523,7 +537,7 @@ auto redis_pool::release_connection(redisAsyncContext *ctx, } } - conn->elt->release_active(conn); + conn->elt->release_connection(conn); } else { RSPAMD_UNREACHABLE;