/* Web Polygraph http://www.web-polygraph.org/
* (C) 2003-2006 The Measurement Factory
* Licensed under the Apache License, Version 2.0 */
#include "pgl/pgl.h"
#include "xstd/h/iostream.h"
#include "xstd/h/sstream.h"
#include "xstd/String.h"
#include "xstd/gadgets.h"
#include "pgl/PglRec.h"
#include "pgl/PglIntSym.h"
#include "pgl/PglNetAddrSym.h"
#include "pgl/PglArraySym.h"
#include "pgl/PglNetAddrRange.h"
#include "pgl/VerThreeAsSym.h"
#include "pgl/BenchSym.h"
#include "pgl/BenchSideSym.h"
const String VerThreeAsSym::TheType = "VerThreeAs";
VerThreeAsSym::VerThreeAsSym(const String &aType, PglRec *aRec): AddrSchemeSym(aType, aRec) {
}
String VerThreeAsSym::addresses(const BenchSideSym *side, int shift, ArraySym *&addrs) const {
if (!side)
return "bench side is not configured";
const NetAddrSym *mask = side->addrMaskSym();
if (!mask)
return "address mask is not set";
Assert(side->bench());
double reqRate, hostLoad, agentLoad;
if (!side->bench()->peakReqRate(reqRate) ||
!side->maxHostLoad(hostLoad) || !side->maxAgentLoad(agentLoad) ||
agentLoad <= 0)
return "peak_req_rate, max_host_load, or max_agent_load not set";
const int hostCount = (int)xceil(reqRate, hostLoad);
const int rbtCntApx = doubleDiv(hostCount, reqRate, agentLoad);
const int srvCntApx = singleDiv(hostCount, rbtCntApx*0.1 + 500);
const int agentCntApx = shift ? srvCntApx : rbtCntApx;
const int maxX = doubleDiv(hostCount, agentCntApx, 250);
const int maxY = (int)xceil(agentCntApx, maxX);
const String sideStr = ipRangeToStr(*mask, shift+1, maxX, 1, maxY);
addrs = ipStrToArr(sideStr);
return String();
}
ArraySym *VerThreeAsSym::ipStrToArr(const String &str) const {
PglNetAddrRange ar;
if (!ar.parse(str))
return 0;
return ar.toSyms(loc());
}
syntax highlighted by Code2HTML, v. 0.9.1