diff --git a/src/generator.c b/src/generator.c index 867bf5d2..8236d609 100644 --- a/src/generator.c +++ b/src/generator.c @@ -944,9 +944,16 @@ static void send_stratifier_deadproxy(ckpool_t *ckp, const int id, const int sub send_proc(ckp->stratifier, buf); } -/* Remove the subproxy from the proxi list and put it on the dead list */ +/* Remove the subproxy from the proxi list and put it on the dead list. + * Further use of the subproxy pointer may point to a new proxy but will not + * dereference */ static void disable_subproxy(gdata_t *gdata, proxy_instance_t *proxi, proxy_instance_t *subproxy) { + subproxy->alive = false; + send_stratifier_deadproxy(gdata->ckp, subproxy->id, subproxy->subid); + if (parent_proxy(subproxy)) + return; + mutex_lock(&proxi->proxy_lock); subproxy->disabled = true; /* Make sure subproxy is still in the list */ @@ -957,11 +964,8 @@ static void disable_subproxy(gdata_t *gdata, proxy_instance_t *proxi, proxy_inst } mutex_unlock(&proxi->proxy_lock); - if (subproxy) { - send_stratifier_deadproxy(gdata->ckp, subproxy->id, subproxy->subid); - if (!parent_proxy(subproxy)) - store_proxy(gdata, subproxy); - } + if (subproxy) + store_proxy(gdata, subproxy); } /* If the parent is no longer in use due to reconnect, we shouldn't use any of @@ -973,6 +977,7 @@ static void drop_subproxies(proxy_instance_t *proxi) mutex_lock(&proxi->proxy_lock); HASH_ITER(sh, proxi->subproxies, subproxy, tmp) { if (!parent_proxy(subproxy)) { + send_stratifier_deadproxy(proxi->ckp, proxi->id, subproxy->subid); subproxy->disabled = true; Close(subproxy->cs->fd); } @@ -1540,13 +1545,9 @@ static void *proxy_send(void *arg) json_decref(msg->json_msg); free(msg); if (!ret && subproxy) { - if (cs->fd > 0) { - LOGWARNING("Proxy %d:%d %s failed to send msg in proxy_send, dropping to reconnect", - proxy->id, proxy->subid, proxy->si->url); - Close(cs->fd); - } - if (!parent_proxy(subproxy) && !subproxy->disabled) - disable_subproxy(gdata, proxy, subproxy); + LOGNOTICE("Proxy %d:%d %s failed to send msg in proxy_send, dropping to reconnect", + proxy->id, proxy->subid, proxy->si->url); + disable_subproxy(gdata, proxy, subproxy); } } return NULL; @@ -1902,11 +1903,9 @@ static void *proxy_recv(void *arg) ret = read_socket_line(cs, 5); } if (ret < 1) { - subproxy->alive = false; - if (!parent_proxy(subproxy)) - recruit_subproxy(proxi); LOGNOTICE("Proxy %d:%d %s failed to epoll/read_socket_line in proxy_recv, attempting reconnect", proxi->id, subproxy->subid, subproxy->si->url); + disable_subproxy(gdata, proxi, subproxy); continue; } if (parse_method(ckp, subproxy, cs->buf)) { @@ -1914,12 +1913,11 @@ static void *proxy_recv(void *arg) /* Call this proxy dead to allow us to fail * over to a backup pool until the reconnect * pool is up */ - subproxy->alive = false; disable_subproxy(gdata, proxi, subproxy); if (parent_proxy(subproxy)) { reconnect_generator(ckp); LOGWARNING("Proxy %d:%s reconnect issue, dropping existing connection", - subproxy->id, subproxy->si->url); + subproxy->id, subproxy->si->url); break; } else recruit_subproxy(proxi);