]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Author: Henrik Nordstrom <henrik@henriknordstrom.net>
authorAmos Jeffries <amosjeffries@squid-cache.org>
Fri, 8 Oct 2010 03:25:56 +0000 (21:25 -0600)
committerAmos Jeffries <amosjeffries@squid-cache.org>
Fri, 8 Oct 2010 03:25:56 +0000 (21:25 -0600)
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

index cda398af78841ea6b2e4771fe31039d5cddcbb5a..f9807b8076c50ca187dfd6198f503f942d88a824 100644 (file)
@@ -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);