|
|
@ -1485,6 +1485,17 @@ static void *passthrough_recv(void *arg) |
|
|
|
|
|
|
|
|
|
|
|
static proxy_instance_t *best_proxy(ckpool_t *ckp, gdata_t *gdata); |
|
|
|
static proxy_instance_t *best_proxy(ckpool_t *ckp, gdata_t *gdata); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static proxy_instance_t *current_proxy(gdata_t *gdata) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
proxy_instance_t *ret; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mutex_lock(&gdata->lock); |
|
|
|
|
|
|
|
ret = gdata->proxy; |
|
|
|
|
|
|
|
mutex_unlock(&gdata->lock); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* For receiving messages from the upstream proxy, also responsible for setting
|
|
|
|
/* For receiving messages from the upstream proxy, also responsible for setting
|
|
|
|
* up the connection and testing it's alive. */ |
|
|
|
* up the connection and testing it's alive. */ |
|
|
|
static void *proxy_recv(void *arg) |
|
|
|
static void *proxy_recv(void *arg) |
|
|
@ -1493,6 +1504,7 @@ static void *proxy_recv(void *arg) |
|
|
|
server_instance_t *si = proxi->si; |
|
|
|
server_instance_t *si = proxi->si; |
|
|
|
connsock_t *cs = proxi->cs; |
|
|
|
connsock_t *cs = proxi->cs; |
|
|
|
ckpool_t *ckp = proxi->ckp; |
|
|
|
ckpool_t *ckp = proxi->ckp; |
|
|
|
|
|
|
|
gdata_t *gdata = ckp->data; |
|
|
|
|
|
|
|
|
|
|
|
rename_proc("proxyrecv"); |
|
|
|
rename_proc("proxyrecv"); |
|
|
|
|
|
|
|
|
|
|
@ -1520,7 +1532,7 @@ static void *proxy_recv(void *arg) |
|
|
|
} |
|
|
|
} |
|
|
|
/* Wait 90 seconds before declaring this upstream pool alive
|
|
|
|
/* Wait 90 seconds before declaring this upstream pool alive
|
|
|
|
* to prevent switching to unstable pools. */ |
|
|
|
* to prevent switching to unstable pools. */ |
|
|
|
if (!proxi->alive && (!best_proxy(ckp, ckp->data) || |
|
|
|
if (!proxi->alive && (!best_proxy(ckp, gdata) || |
|
|
|
time(NULL) - proxi->reconnect_time > 90)) { |
|
|
|
time(NULL) - proxi->reconnect_time > 90)) { |
|
|
|
LOGWARNING("Proxy %d:%s recovered", proxi->id, proxi->si->url); |
|
|
|
LOGWARNING("Proxy %d:%s recovered", proxi->id, proxi->si->url); |
|
|
|
proxi->alive = true; |
|
|
|
proxi->alive = true; |
|
|
@ -1569,7 +1581,7 @@ static void *proxy_recv(void *arg) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
if (parse_method(proxi, cs->buf)) { |
|
|
|
if (parse_method(proxi, cs->buf)) { |
|
|
|
if (proxi->notified) { |
|
|
|
if (proxi->notified && proxi == current_proxy(gdata)) { |
|
|
|
snprintf(buf, 127, "notify=%d", proxi->id); |
|
|
|
snprintf(buf, 127, "notify=%d", proxi->id); |
|
|
|
send_proc(ckp->stratifier, buf); |
|
|
|
send_proc(ckp->stratifier, buf); |
|
|
|
proxi->notified = false; |
|
|
|
proxi->notified = false; |
|
|
|