/* Web Polygraph http://www.web-polygraph.org/ * (C) 2003-2006 The Measurement Factory * Licensed under the Apache License, Version 2.0 */ #include "base/polygraph.h" #include "xstd/h/iostream.h" #include "xstd/h/iomanip.h" #include "xstd/Clock.h" #include "xstd/gadgets.h" #include "runtime/StatPhaseMgr.h" #include "runtime/StatPhase.h" #include "runtime/PubWorld.h" #include "runtime/Viservs.h" #include "runtime/HostMap.h" #include "runtime/LogComment.h" #include "client/ServerRep.h" #include "client/WarmupPlan.h" int WarmupPlan::TheReqCnt = 0; WarmupPlan::WarmupPlan(const Array &visIdx): thePlan(visIdx.count()) { for (int i = 0; i < visIdx.count(); ++i) thePlan.enqueue(visIdx[i]); static RndGen rng; thePlan.randomize(rng); } int WarmupPlan::selectViserv() { int viserv = -1; while (!thePlan.empty() && viserv < 0) { const int vs = thePlan.dequeue(); if (WarmViserv(vs)) continue; thePlan.enqueue(vs); viserv = vs; TheReqCnt++; } if (thePlan.count()) ReportProgress(); else if (viserv < 0) CheckTermination(); return viserv; } // warm if any of the targets was successfully accessed // or at least two access attempts have been made bool WarmupPlan::WarmViserv(int viserv) { const HostCfg *hcfg = TheHostMap->at(viserv); if (Should(hcfg && hcfg->theServerRep)) { return hcfg->theServerRep->responses() > 0 || hcfg->theServerRep->requests() > 1; } return false; } void WarmupPlan::ReportProgress() { const Time reportGap = Time::Sec(45); // how often to report static const Time start = TheClock; static Time nextReport = start + reportGap; if (nextReport >= TheClock) return; const int visibleCnt = PubWorld::Count(); const int readyCnt = ReadyCount(); const double readyPct = Percent(readyCnt, visibleCnt); Comment(5) << "fyi:" << " servers visible: " << visibleCnt << " warm: " << readyCnt << " (" << readyPct << "%)" << " attempts: " << TheReqCnt << endc; nextReport = TheClock + reportGap; } void WarmupPlan::CheckTermination() { const int visibleCnt = PubWorld::Count(); if (ReadyCount() < visibleCnt) return; static bool didOnce = false; if (!didOnce) { Comment(3) << "fyi: server scan completed with all local robots" << " ready to hit all " << visibleCnt << " visible servers" << endc; TheStatPhaseMgr->unlock(); didOnce = true; } } int WarmupPlan::ReadyCount() { int count = 0; for (ViservIterator i; !i.atEnd(); ++i) { if (WarmViserv(i.viserv())) count++; } return count; }