Skip to content

Commit

Permalink
lib-http: client: If a peer object is no longer linked to a queue, do…
Browse files Browse the repository at this point in the history
…n't close it until all connections are inactive.

The peer object is canceled, rather than closed. Which means that any newly started and idle connections are closed immediately.
Requests may be pending though.
This is only relevant when hosts/queues are removed at some point.
This is a preparational change for having a maximum lifetime on hosts/queues, in which case this becomes a possibility.
  • Loading branch information
stephanbosch authored and GitLab committed Nov 2, 2016
1 parent a8f65a7 commit ac325a7
Showing 1 changed file with 21 additions and 4 deletions.
25 changes: 21 additions & 4 deletions src/lib-http/http-client-peer.c
Expand Up @@ -200,6 +200,23 @@ bool http_client_peer_is_connected(struct http_client_peer *peer)
return FALSE;
}

static void
http_client_peer_cancel(struct http_client_peer *peer)
{
struct http_client_connection **conn;
ARRAY_TYPE(http_client_connection) conns;

http_client_peer_debug(peer, "Peer cancel");

/* make a copy of the connection array; freed connections modify it */
t_array_init(&conns, array_count(&peer->conns));
array_copy(&conns.arr, 0, &peer->conns.arr, 0, array_count(&peer->conns));
array_foreach_modifiable(&conns, conn) {
if (!http_client_connection_is_active(*conn))
http_client_connection_close(conn);
}
}

static unsigned int
http_client_peer_requests_pending(struct http_client_peer *peer,
unsigned int *num_urgent_r)
Expand Down Expand Up @@ -253,13 +270,13 @@ http_client_peer_handle_requests_real(struct http_client_peer *peer)
/* FIXME: limit the number of requests handled in one run to prevent
I/O starvation. */

/* disconnect if we're not linked to any queue anymore */
/* disconnect pending connections if we're not linked to any queue
anymore */
if (array_count(&peer->queues) == 0) {
i_assert(peer->to_backoff != NULL);
http_client_peer_debug(peer,
"Peer no longer used; will now disconnect "
"Peer no longer used; will now cancel pending connections "
"(%u connections exist)", array_count(&peer->conns));
http_client_peer_close(&peer);
http_client_peer_cancel(peer);
return;
}

Expand Down

0 comments on commit ac325a7

Please sign in to comment.