From: Henrik Nordstrom Date: Mon, 20 Sep 2010 19:27:24 +0000 (+0200) Subject: Bug 3056 - comm.cc "!fd_table[fd].closing()" assertion from helperServerFree when... X-Git-Tag: take1~241 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4aca092aca008015148f1a276e2e773bd626d82c;p=thirdparty%2Fsquid.git Bug 3056 - comm.cc "!fd_table[fd].closing()" assertion from helperServerFree when a helper crashes while processing requests reshuffle helperServerFree so it first unregisters the failed helper and starts new ones if needed before it calls the callbacks on any pending requests. If not those ends up resheduling the request on this same crashed and partially shut down helper. --- diff --git a/src/helper.cc b/src/helper.cc index 000cfc8ad4..c159c35756 100644 --- a/src/helper.cc +++ b/src/helper.cc @@ -687,21 +687,6 @@ helperServerFree(int fd, void *data) srv->writebuf = NULL; } - for (i = 0; i < concurrency; i++) { - if ((r = srv->requests[i])) { - void *cbdata; - - if (cbdataReferenceValidDone(r->data, &cbdata)) - r->callback(cbdata, NULL); - - helperRequestFree(r); - - srv->requests[i] = NULL; - } - } - - safe_free(srv->requests); - if (srv->wfd != srv->rfd && srv->wfd != -1) comm_close(srv->wfd); @@ -726,6 +711,20 @@ helperServerFree(int fd, void *data) } } + for (i = 0; i < concurrency; i++) { + if ((r = srv->requests[i])) { + void *cbdata; + + if (cbdataReferenceValidDone(r->data, &cbdata)) + r->callback(cbdata, NULL); + + helperRequestFree(r); + + srv->requests[i] = NULL; + } + } + safe_free(srv->requests); + cbdataReferenceDone(srv->parent); cbdataFree(srv); } @@ -749,17 +748,6 @@ helperStatefulServerFree(int fd, void *data) #endif - if ((r = srv->request)) { - void *cbdata; - - if (cbdataReferenceValidDone(r->data, &cbdata)) - r->callback(cbdata, srv, NULL); - - helperStatefulRequestFree(r); - - srv->request = NULL; - } - /* TODO: walk the local queue of requests and carry them all out */ if (srv->wfd != srv->rfd && srv->wfd != -1) comm_close(srv->wfd); @@ -785,6 +773,17 @@ helperStatefulServerFree(int fd, void *data) } } + if ((r = srv->request)) { + void *cbdata; + + if (cbdataReferenceValidDone(r->data, &cbdata)) + r->callback(cbdata, srv, NULL); + + helperStatefulRequestFree(r); + + srv->request = NULL; + } + if (srv->data != NULL) hlp->datapool->freeOne(srv->data);