/*
- * DEBUG: section 93 Adaptation
+ * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
+ *
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
*/
-#include "squid-old.h"
+/* DEBUG: section 93 Adaptation */
+
+#include "squid.h"
#include "adaptation/Answer.h"
#include "adaptation/Config.h"
#include "adaptation/Iterator.h"
#include "adaptation/ServiceFilter.h"
#include "adaptation/ServiceGroups.h"
#include "base/TextException.h"
-#include "HttpRequest.h"
-#include "HttpReply.h"
#include "HttpMsg.h"
-
+#include "HttpReply.h"
+#include "HttpRequest.h"
+#include "sbuf/StringConvert.h"
Adaptation::Iterator::Iterator(
HttpMsg *aMsg, HttpRequest *aCause,
+ AccessLogEntry::Pointer &alp,
const ServiceGroupPointer &aGroup):
- AsyncJob("Iterator"),
- Adaptation::Initiate("Iterator"),
- theGroup(aGroup),
- theMsg(HTTPMSGLOCK(aMsg)),
- theCause(aCause ? HTTPMSGLOCK(aCause) : NULL),
- theLauncher(0),
- iterations(0),
- adapted(false)
+ AsyncJob("Iterator"),
+ Adaptation::Initiate("Iterator"),
+ theGroup(aGroup),
+ theMsg(aMsg),
+ theCause(aCause),
+ al(alp),
+ theLauncher(0),
+ iterations(0),
+ adapted(false)
{
+ if (theCause != NULL)
+ HTTPMSGLOCK(theCause);
+
+ if (theMsg != NULL)
+ HTTPMSGLOCK(theMsg);
}
Adaptation::Iterator::~Iterator()
Adaptation::Initiate::start();
thePlan = ServicePlan(theGroup, filter());
+
+ // Add adaptation group name once and now, before
+ // dynamic groups change it at step() time.
+ if (Adaptation::Config::needHistory && !thePlan.exhausted() && (dynamic_cast<ServiceSet *>(theGroup.getRaw()) || dynamic_cast<ServiceChain *>(theGroup.getRaw()))) {
+ HttpRequest *request = dynamic_cast<HttpRequest*>(theMsg);
+ if (!request)
+ request = theCause;
+ Must(request);
+ Adaptation::History::Pointer ah = request->adaptHistory(true);
+ auto gid = StringToSBuf(theGroup->id);
+ ah->recordAdaptationService(gid);
+ }
+
step();
}
return;
}
+ HttpRequest *request = dynamic_cast<HttpRequest*>(theMsg);
+ if (!request)
+ request = theCause;
+ assert(request);
+ request->clearError();
+
if (iterations > Adaptation::Config::service_iteration_limit) {
debugs(93,DBG_CRITICAL, "Adaptation iterations limit (" <<
Adaptation::Config::service_iteration_limit << ") exceeded:\n" <<
Must(service != NULL);
debugs(93,5, HERE << "using adaptation service: " << service->cfg().key);
+ if (Adaptation::Config::needHistory) {
+ Adaptation::History::Pointer ah = request->adaptHistory(true);
+ auto uid = StringToSBuf(thePlan.current()->cfg().key);
+ ah->recordAdaptationService(uid);
+ }
+
theLauncher = initiateAdaptation(
- service->makeXactLauncher(theMsg, theCause));
+ service->makeXactLauncher(theMsg, theCause, al));
Must(initiated(theLauncher));
Must(!done());
}
{
switch (answer.kind) {
case Answer::akForward:
- handleAdaptedHeader(answer.message);
+ handleAdaptedHeader(const_cast<HttpMsg*>(answer.message.getRaw()));
break;
case Answer::akBlock:
Must(aMsg);
HTTPMSGUNLOCK(theMsg);
- theMsg = HTTPMSGLOCK(aMsg);
+ theMsg = aMsg;
+ HTTPMSGLOCK(theMsg);
adapted = true;
clearAdaptation(theLauncher);
debugs(85,3, HERE << "retiring old plan: " << thePlan);
- Adaptation::ServiceFilter filter = this->filter();
+ Adaptation::ServiceFilter f = this->filter();
DynamicGroupCfg current, future;
- DynamicServiceChain::Split(filter, services, current, future);
+ DynamicServiceChain::Split(f, services, current, future);
if (!future.empty()) {
ah->setFutureServices(future);
}
// use the current config even if it is empty; we must replace the old plan
- theGroup = new DynamicServiceChain(current, filter); // refcounted
- thePlan = ServicePlan(theGroup, filter);
+ theGroup = new DynamicServiceChain(current, f); // refcounted
+ thePlan = ServicePlan(theGroup, f);
debugs(85,3, HERE << "adopted service-proposed plan: " << thePlan);
return true;
}
Must(false); // should not happen
}
- return ServiceFilter(method, theGroup->point, req, rep);
+ return ServiceFilter(method, theGroup->point, req, rep, al);
}
CBDATA_NAMESPACED_CLASS_INIT(Adaptation, Iterator);
+