From 34687f7b2412bfa1175e6cff94d2ac946c493a43 Mon Sep 17 00:00:00 2001 From: Alexander Komyagin Date: Sun, 2 Dec 2012 01:17:17 -0700 Subject: [PATCH] Bug 3688: Lots of Orphan Comm:Connections to ICAP server --- src/adaptation/icap/Xaction.cc | 13 +++++++++++-- src/adaptation/icap/Xaction.h | 5 +++++ src/comm/ConnOpener.h | 2 ++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/adaptation/icap/Xaction.cc b/src/adaptation/icap/Xaction.cc index 21e9cee53c..1d87b57dfd 100644 --- a/src/adaptation/icap/Xaction.cc +++ b/src/adaptation/icap/Xaction.cc @@ -42,7 +42,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 @@ -167,7 +168,7 @@ Adaptation::Icap::Xaction::dnsLookupDone(const ipcache_addrs *ia) // TODO: service bypass status may differ from that of a transaction typedef CommCbMemFunT 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); } @@ -222,6 +223,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; @@ -506,6 +509,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 diff --git a/src/adaptation/icap/Xaction.h b/src/adaptation/icap/Xaction.h index 66d2bd21c4..490d3a4835 100644 --- a/src/adaptation/icap/Xaction.h +++ b/src/adaptation/icap/Xaction.h @@ -44,6 +44,10 @@ #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); }; diff --git a/src/comm/ConnOpener.h b/src/comm/ConnOpener.h index 25c2b9a2b6..45e4c41287 100644 --- a/src/comm/ConnOpener.h +++ b/src/comm/ConnOpener.h @@ -21,6 +21,8 @@ protected: virtual void swanSong(); public: + void noteAbort() { mustStop("externally aborted"); } + typedef CbcPointer Pointer; virtual bool doneAll() const; -- 2.47.2