]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Bug 3056 - comm.cc "!fd_table[fd].closing()" assertion from helperServerFree when...
authorHenrik Nordstrom <henrik@henriknordstrom.net>
Mon, 20 Sep 2010 19:27:24 +0000 (21:27 +0200)
committerHenrik Nordstrom <henrik@henriknordstrom.net>
Mon, 20 Sep 2010 19:27:24 +0000 (21:27 +0200)
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

index 000cfc8ad403bb9e800727adb68f9447e7926304..c159c35756b7fff4998f7fa20b2292854b96b61c 100644 (file)
@@ -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);