From 63a415767ae987574a7f76d2cf69ca4ee86dab1b Mon Sep 17 00:00:00 2001 From: Amos Jeffries Date: Thu, 7 Oct 2010 21:25:56 -0600 Subject: [PATCH] Author: Henrik Nordstrom 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. With thanks to Stephen Thorne for porting to 3.1. --- src/helper.cc | 51 +++++++++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/src/helper.cc b/src/helper.cc index cda398af78..f9807b8076 100644 --- a/src/helper.cc +++ b/src/helper.cc @@ -728,21 +728,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); @@ -770,6 +755,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); } @@ -793,17 +792,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); @@ -831,6 +819,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->free(srv->data); -- 2.47.2