conn_maxage: move the check to prune_dead_connections()
... and avoid the locking issue. Reported-by: Kunal Ekawde Fixes #4029 Closes #4032
This commit is contained in:
parent
40259ca655
commit
755083d00d
52
lib/url.c
52
lib/url.c
@ -881,6 +881,26 @@ proxy_info_matches(const struct proxy_info* data,
|
|||||||
#define proxy_info_matches(x,y) FALSE
|
#define proxy_info_matches(x,y) FALSE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* A connection has to have been idle for a shorter time than 'maxage_conn' to
|
||||||
|
be subject for reuse. The success rate is just too low after this. */
|
||||||
|
|
||||||
|
static bool conn_maxage(struct Curl_easy *data,
|
||||||
|
struct connectdata *conn,
|
||||||
|
struct curltime now)
|
||||||
|
{
|
||||||
|
if(!conn->data) {
|
||||||
|
timediff_t idletime = Curl_timediff(now, conn->lastused);
|
||||||
|
idletime /= 1000; /* integer seconds is fine */
|
||||||
|
|
||||||
|
if(idletime > data->set.maxage_conn) {
|
||||||
|
infof(data, "Too old connection (%ld seconds), disconnect it\n",
|
||||||
|
idletime);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function checks if the given connection is dead and extracts it from
|
* This function checks if the given connection is dead and extracts it from
|
||||||
* the connection cache if so.
|
* the connection cache if so.
|
||||||
@ -897,7 +917,11 @@ static bool extract_if_dead(struct connectdata *conn,
|
|||||||
/* The check for a dead socket makes sense only if the connection isn't in
|
/* The check for a dead socket makes sense only if the connection isn't in
|
||||||
use */
|
use */
|
||||||
bool dead;
|
bool dead;
|
||||||
if(conn->handler->connection_check) {
|
struct curltime now = Curl_now();
|
||||||
|
if(conn_maxage(data, conn, now)) {
|
||||||
|
dead = TRUE;
|
||||||
|
}
|
||||||
|
else if(conn->handler->connection_check) {
|
||||||
/* The protocol has a special method for checking the state of the
|
/* The protocol has a special method for checking the state of the
|
||||||
connection. Use it to check if the connection is dead. */
|
connection. Use it to check if the connection is dead. */
|
||||||
unsigned int state;
|
unsigned int state;
|
||||||
@ -964,25 +988,6 @@ static void prune_dead_connections(struct Curl_easy *data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A connection has to have been idle for a shorter time than 'maxage_conn' to
|
|
||||||
be subject for reuse. The success rate is just too low after this. */
|
|
||||||
|
|
||||||
static bool conn_maxage(struct Curl_easy *data,
|
|
||||||
struct connectdata *conn,
|
|
||||||
struct curltime now)
|
|
||||||
{
|
|
||||||
if(!conn->data) {
|
|
||||||
timediff_t idletime = Curl_timediff(now, conn->lastused);
|
|
||||||
idletime /= 1000; /* integer seconds is fine */
|
|
||||||
|
|
||||||
if(idletime > data->set.maxage_conn) {
|
|
||||||
infof(data, "Too old connection (%ld seconds), disconnect it\n",
|
|
||||||
idletime);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* Given one filled in connection struct (named needle), this function should
|
* Given one filled in connection struct (named needle), this function should
|
||||||
* detect if there already is one that has all the significant details
|
* detect if there already is one that has all the significant details
|
||||||
@ -1006,7 +1011,6 @@ ConnectionExists(struct Curl_easy *data,
|
|||||||
bool foundPendingCandidate = FALSE;
|
bool foundPendingCandidate = FALSE;
|
||||||
bool canmultiplex = IsMultiplexingPossible(data, needle);
|
bool canmultiplex = IsMultiplexingPossible(data, needle);
|
||||||
struct connectbundle *bundle;
|
struct connectbundle *bundle;
|
||||||
struct curltime now = Curl_now();
|
|
||||||
const char *hostbundle;
|
const char *hostbundle;
|
||||||
|
|
||||||
#ifdef USE_NTLM
|
#ifdef USE_NTLM
|
||||||
@ -1074,12 +1078,6 @@ ConnectionExists(struct Curl_easy *data,
|
|||||||
/* connect-only connections will not be reused */
|
/* connect-only connections will not be reused */
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(conn_maxage(data, check, now) || extract_if_dead(check, data)) {
|
|
||||||
/* disconnect it */
|
|
||||||
(void)Curl_disconnect(data, check, /* dead_connection */TRUE);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
multiplexed = CONN_INUSE(check) &&
|
multiplexed = CONN_INUSE(check) &&
|
||||||
(bundle->multiuse == BUNDLE_MULTIPLEX);
|
(bundle->multiuse == BUNDLE_MULTIPLEX);
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user