From 4aca092aca008015148f1a276e2e773bd626d82c Mon Sep 17 00:00:00 2001 From: Henrik Nordstrom Date: Mon, 20 Sep 2010 21:27:24 +0200 Subject: [PATCH] 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. --- src/helper.cc | 51 +++++++++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 26 deletions(-) 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); -- 2.47.2