]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Bug 3688: Lots of Orphan Comm:Connections to ICAP server
authorAlexander Komyagin <komyagin@altell.ru>
Sun, 2 Dec 2012 07:27:40 +0000 (00:27 -0700)
committerAmos Jeffries <squid3@treenet.co.nz>
Sun, 2 Dec 2012 07:27:40 +0000 (00:27 -0700)
src/adaptation/icap/Xaction.cc
src/adaptation/icap/Xaction.h
src/comm/ConnOpener.h

index 94d3d4e97f0fdc70558eb4bfdaaa575d78afb3ea..34238f260d92755f18c7d6e0f30c74668af86604 100644 (file)
@@ -45,7 +45,8 @@ Adaptation::Icap::Xaction::Xaction(const char *aTypeName, Adaptation::Icap::Serv
         ignoreLastWrite(false),
         connector(NULL), reader(NULL), writer(NULL), closer(NULL),
         alep(new AccessLogEntry),
-        al(*alep)
+        al(*alep),
+        cs(NULL)
 {
     debugs(93,3, typeName << " constructed, this=" << this <<
            " [icapx" << id << ']'); // we should not call virtual status() here
@@ -170,7 +171,7 @@ Adaptation::Icap::Xaction::dnsLookupDone(const ipcache_addrs *ia)
     // TODO: service bypass status may differ from that of a transaction
     typedef CommCbMemFunT<Adaptation::Icap::Xaction, CommConnectCbParams> ConnectDialer;
     connector = JobCallback(93,3, ConnectDialer, this, Adaptation::Icap::Xaction::noteCommConnected);
-    Comm::ConnOpener *cs = new Comm::ConnOpener(connection, connector, TheConfig.connect_timeout(service().cfg().bypass));
+    cs = new Comm::ConnOpener(connection, connector, TheConfig.connect_timeout(service().cfg().bypass));
     cs->setHost(s.cfg().host.termedBuf());
     AsyncJob::Start(cs);
 }
@@ -225,6 +226,8 @@ void Adaptation::Icap::Xaction::closeConnection()
 // connection with the ICAP service established
 void Adaptation::Icap::Xaction::noteCommConnected(const CommConnectCbParams &io)
 {
+    cs = NULL;
+
     if (io.flag == COMM_TIMEOUT) {
         handleCommTimedout();
         return;
@@ -508,6 +511,12 @@ void Adaptation::Icap::Xaction::setOutcome(const Adaptation::Icap::XactOutcome &
 void Adaptation::Icap::Xaction::swanSong()
 {
     // kids should sing first and then call the parent method.
+    if (cs) {
+        debugs(93,6, HERE << id << " about to notify ConnOpener!");
+        CallJobHere(93, 3, cs, Comm::ConnOpener, noteAbort);
+        cs = NULL;
+        service().noteConnectionFailed("abort");
+    }
 
     closeConnection(); // TODO: rename because we do not always close
 
index 4e9a03e575f7e864f5b0b5a9d7c96112dbdcef7b..0dd6938445d86c4e1a07ce6b7d82efaa00ea8a9e 100644 (file)
 #include "ipcache.h"
 
 class CommConnectCbParams;
+namespace Comm
+{
+class ConnOpener;
+}
 
 namespace Adaptation
 {
@@ -188,6 +192,7 @@ protected:
     timeval icap_tio_finish;   /*time when the last byte of the ICAP responsewas received*/
 
 private:
+    Comm::ConnOpener *cs;
     //CBDATA_CLASS2(Xaction);
 };
 
index 25c2b9a2b6a43cafe12378ba37be698ad7e40828..45e4c41287a388ac5c6b0abcd4af8d27d2c7a32c 100644 (file)
@@ -21,6 +21,8 @@ protected:
     virtual void swanSong();
 
 public:
+    void noteAbort() { mustStop("externally aborted"); }
+
     typedef CbcPointer<ConnOpener> Pointer;
 
     virtual bool doneAll() const;