]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: http-client-connection - Use separate flag for idle status.
authorStephan Bosch <stephan.bosch@open-xchange.com>
Wed, 12 Aug 2020 17:54:50 +0000 (19:54 +0200)
committerStephan Bosch <stephan.bosch@open-xchange.com>
Thu, 27 Aug 2020 09:36:36 +0000 (11:36 +0200)
It used the presence of the idle timeout before, which isn't acceptable when the
timeout is changed to be optional (happens in later commit).

src/lib-http/http-client-connection.c
src/lib-http/http-client-private.h

index 160cf9f109ba50550faedd1dec71458229a3e4f2..2740a05bb7f64abc27b6defe114ce2ed18249577 100644 (file)
@@ -110,7 +110,7 @@ http_client_connection_count_pending(struct http_client_connection *conn)
 
 bool http_client_connection_is_idle(struct http_client_connection *conn)
 {
-       return (conn->to_idle != NULL);
+       return conn->idle;
 }
 
 bool http_client_connection_is_active(struct http_client_connection *conn)
@@ -436,9 +436,11 @@ void http_client_connection_lost_peer(struct http_client_connection *conn)
 
        i_assert(!conn->in_req_callback);
 
-       if (conn->to_idle == NULL) {
+       if (!conn->idle) {
                unsigned int timeout, count, max;
 
+               i_assert(conn->to_idle == NULL);
+
                count = array_count(&ppool->conns);
                i_assert(count > 0);
                max = http_client_peer_shared_max_connections(pshared);
@@ -465,6 +467,8 @@ void http_client_connection_lost_peer(struct http_client_connection *conn)
                conn->to_idle = timeout_add_to(
                        conn->conn.ioloop, timeout,
                        http_client_connection_idle_timeout, conn);
+
+               conn->idle = TRUE;
                array_push_back(&ppool->idle_conns, &conn);
        } else {
                e_debug(conn->event, "Lost peer; already idle");
@@ -483,14 +487,15 @@ void http_client_connection_check_idle(struct http_client_connection *conn)
 
        peer = conn->peer;
        if (peer == NULL) {
-               i_assert(conn->to_idle != NULL);
+               i_assert(conn->idle);
                return;
        }
 
-       if (conn->to_idle != NULL) {
-               /* Timeout already set */
+       if (conn->idle) {
+               /* Already idle */
                return;
        }
+       i_assert(conn->to_idle == NULL);
 
        client = peer->client;
        set = &client->set;
@@ -536,6 +541,8 @@ void http_client_connection_check_idle(struct http_client_connection *conn)
                conn->to_idle = timeout_add_to(
                        conn->conn.ioloop, timeout,
                        http_client_connection_idle_timeout, conn);
+
+               conn->idle = TRUE;
                array_push_back(&ppool->idle_conns, &conn);
        }
 }
@@ -546,8 +553,8 @@ http_client_connection_stop_idle(struct http_client_connection *conn)
        struct http_client_connection *const *conn_idx;
        ARRAY_TYPE(http_client_connection) *conn_arr;
 
-       if (conn->to_idle != NULL)
-               timeout_remove(&conn->to_idle);
+       timeout_remove(&conn->to_idle);
+       conn->idle = FALSE;
 
        conn_arr = &conn->ppool->idle_conns;
        array_foreach(conn_arr, conn_idx) {
index d6c854e14e878c588acdce85737edff3b931f042..ccc41ed91afc9608acc9e8500fb116c58ee80b3e 100644 (file)
@@ -194,6 +194,7 @@ struct http_client_connection {
        ARRAY_TYPE(http_client_request) request_wait_list;
 
        bool connected:1;           /* Connection is connected */
+       bool idle:1;                /* Connection is idle */
        bool tunneling:1;           /* Last sent request turns this
                                       connection into tunnel */
        bool connect_succeeded:1;   /* Connection succeeded including SSL */