/* 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/math.h"
#include "xstd/h/iostream.h"
#include "xstd/h/sstream.h"
#include "xstd/String.h"
#include "xstd/gadgets.h"
#include "base/AnyToString.h"
#include "pgl/PglRec.h"
#include "pgl/PglStringSym.h"
#include "pgl/PglArraySym.h"
#include "pgl/PglNetAddrSym.h"
#include "pgl/PglNetAddrRange.h"
#include "pgl/PglNetAddrRangeSym.h"
#include "pgl/BenchSym.h"
#include "pgl/BenchSideSym.h"
#include "pgl/PolyMix4AsSym.h"
const String PolyMix4AsSym::TheType = "PolyMix4As";
static const String strPolyMix4 = "PolyMix-4";
PolyMix4AsSym::PolyMix4AsSym(): VerFourAsSym(TheType, new PglRec) {
kind(strPolyMix4);
}
PolyMix4AsSym::PolyMix4AsSym(const String &aType, PglRec *aRec): VerFourAsSym(aType, aRec) {
}
bool PolyMix4AsSym::isA(const String &type) const {
return VerFourAsSym::isA(type) || type == TheType;
}
SynSym *PolyMix4AsSym::dupe(const String &type) const {
if (isA(type))
return new PolyMix4AsSym(this->type(), theRec->clone());
return VerFourAsSym::dupe(type);
}
String PolyMix4AsSym::robots(ArraySym *&addrs) const {
return addresses(theBench->clientSide(), addrs);
}
String PolyMix4AsSym::servers(ArraySym *&addrs) const {
ArraySym *r = 0;
if (const String err = robots(r))
return err;
const int minSrvCount = (int)(500.5 + 0.1*r->count());
delete r;
const BenchSideSym *side = theBench->serverSide();
if (!side)
return "bench side is not specified";
if (SynSym *ams = side->addrMaskSym()) {
cerr << ams->loc() << "warning: addressing schemes in fourth"
<< " generation workloads use addr_space instead of addr_mask;"
<< " consider removing depricated addr_mask from your new"
<< " workloads" << endl;
}
const ArraySym *addrSpace = side->addrSpace();
if (!addrSpace)
return "addr_space not set";
Assert(side->bench());
double reqRate, hostLoad;
if (!side->bench()->peakReqRate(reqRate) ||
!side->maxHostLoad(hostLoad))
return "peak_req_rate, max_host_load, max_agent_load or agents_per_addr not set";
double agentLoad;
if (side->maxAgentLoad(agentLoad)) {
cerr << loc() << "warning: PolyMix-4 addressing scheme does not"
<< " use server_side.max_agent_load, but the bench has"
<< " server_side.max_agent_load defined" << endl;
if (side->loc())
cerr << endl << side->loc() << "warning: server_side.max_agent_load"
<< " is defined here" << endl;
}
const int hostCnt = (int)xceil(reqRate, hostLoad);
const int agentCnt = singleDiv(hostCnt, minSrvCount);
if (agentCnt > addrSpace->count()) {
return "too small address space; " + AnyToString(agentCnt) +
" agents cannot fit into " + AnyToString(addrSpace->count()) +
" space slots";
}
// always use addrLoad of 1 for servers
return distributeAddrs(addrs, addrSpace, hostCnt, agentCnt, 1);
}
String PolyMix4AsSym::proxies(ArraySym *&addrs) const {
return addresses(theBench->proxySide(), addrs);
}
syntax highlighted by Code2HTML, v. 0.9.1