From: Eduard Bagdasaryan Date: Wed, 17 Aug 2022 17:34:55 +0000 (+0000) Subject: AsyncJob-protect and reduce ICAP DNS lookup call chain (#1112) X-Git-Tag: SQUID_6_0_1~131 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cfbe9875800625fc346f7bc35bc2c5676a7355b7;p=thirdparty%2Fsquid.git AsyncJob-protect and reduce ICAP DNS lookup call chain (#1112) Co-authored-by: Alex Rousskov --- diff --git a/src/adaptation/icap/Xaction.cc b/src/adaptation/icap/Xaction.cc index 08572b782c..3dea5e54ef 100644 --- a/src/adaptation/icap/Xaction.cc +++ b/src/adaptation/icap/Xaction.cc @@ -14,6 +14,7 @@ #include "adaptation/icap/Launcher.h" #include "adaptation/icap/Xaction.h" #include "base/JobWait.h" +#include "base/Optional.h" #include "base/TextException.h" #include "comm.h" #include "comm/Connection.h" @@ -146,9 +147,8 @@ static void icapLookupDnsResults(const ipcache_addrs *ia, const Dns::LookupDetails &, void *data) { Adaptation::Icap::Xaction *xa = static_cast(data); - /// TODO: refactor with CallJobHere1, passing either std::optional (after upgrading to C++17) - /// or Optional (when it can take non-trivial types) - xa->dnsLookupDone(ia); + const auto &addr = ia ? Optional(ia->current()) : Optional(); + CallJobHere1(93, 5, CbcPointer(xa), Adaptation::Icap::Xaction, dnsLookupDone, addr); } // TODO: obey service-specific, OPTIONS-reported connection limit @@ -179,14 +179,14 @@ Adaptation::Icap::Xaction::openConnection() } void -Adaptation::Icap::Xaction::dnsLookupDone(const ipcache_addrs *ia) +Adaptation::Icap::Xaction::dnsLookupDone(Optional addr) { assert(waitingForDns); waitingForDns = false; Adaptation::Icap::ServiceRep &s = service(); - if (ia == nullptr) { + if (!addr.has_value()) { debugs(44, DBG_IMPORTANT, "ERROR: ICAP: Unknown service host: " << s.cfg().host); #if WHEN_IPCACHE_NBGETHOSTBYNAME_USES_ASYNC_CALLS @@ -198,7 +198,7 @@ Adaptation::Icap::Xaction::dnsLookupDone(const ipcache_addrs *ia) } const Comm::ConnectionPointer conn = new Comm::Connection(); - conn->remote = ia->current(); + conn->remote = addr.value(); conn->remote.port(s.cfg().port); getOutgoingAddress(nullptr, conn); diff --git a/src/adaptation/icap/Xaction.h b/src/adaptation/icap/Xaction.h index 31a6e22fc9..defdb8dd51 100644 --- a/src/adaptation/icap/Xaction.h +++ b/src/adaptation/icap/Xaction.h @@ -117,7 +117,7 @@ public: /// clear stored error details, if any; used for retries/repeats virtual void clearError() {} virtual AccessLogEntry::Pointer masterLogEntry(); - void dnsLookupDone(const ipcache_addrs *ia); + void dnsLookupDone(Optional); protected: // logging diff --git a/src/base/Optional.h b/src/base/Optional.h index 72440e8e10..a803d30d8c 100644 --- a/src/base/Optional.h +++ b/src/base/Optional.h @@ -10,6 +10,7 @@ #define SQUID__SRC_BASE_OPTIONAL_H #include +#include #include #include @@ -121,5 +122,16 @@ private: bool hasValue_ = false; }; +template +inline +std::ostream &operator <<(std::ostream &os, const Optional &opt) +{ + if (opt.has_value()) + os << opt.value(); + else + os << "[no value]"; + return os; +} + #endif /* SQUID__SRC_BASE_OPTIONAL_H */