/* 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/rndDistrs.h" #include "xstd/StrIdentifier.h" #include "xstd/h/iomanip.h" #include "base/RndPermut.h" #include "base/polyLogCats.h" #include "runtime/PopModel.h" #include "runtime/ErrorMgr.h" #include "runtime/XactAbortCoord.h" #include "runtime/LogComment.h" #include "runtime/polyErrors.h" #include "csm/ContentCfg.h" #include "csm/ContentMgr.h" #include "pgl/ServerSym.h" #include "server/Server.h" #include "server/SrvCfg.h" SrvCfg::SrvCfg(): theServer(0), thePopModel(0), theRepTypeSel(0), theCookieCounts(0), theCookieSizes(0), theCookieSendProb(0), theAbortProb(0) { } SrvCfg::~SrvCfg() { delete thePopModel; delete theRepTypeSel; } void SrvCfg::configure(const ServerSym *aServer) { AgentCfg::configure(aServer); Assert(!theServer && aServer); theServer = aServer; if (PopModelSym *pms = theServer->popModel()) { thePopModel = new PopModel; thePopModel->configure(pms); } configureRepTypes(); // configure content distributions Array csyms; Array cprobs; Assert(theServer->contents(csyms, cprobs) && csyms.count()); Array ccfgs; TheContentMgr.get(csyms, ccfgs); theTypes.configure(ccfgs); configureCookies(); theServer->abortProb(theAbortProb); } void SrvCfg::configureRepTypes() { static StrIdentifier sidf; if (!sidf.count()) { sidf.add("Basic", Server::rptBasic); sidf.add("302 Found", Server::rpt302Found); } theRepTypeSel = theServer->msgTypes(sidf); if (theRepTypeSel) { if (!theServer->popModel()) { cerr << theServer->loc() << "warning: some rep_types may require " << "server popularity model and none was configured" << endl; } } else { // set to default theRepTypeSel = new ConstDistr(new RndGen, Server::rptBasic); } theRepTypeSel->rndGen(LclRndGen("server_req_types")); } void SrvCfg::configureCookies() { theCookieCounts = theServer->cookieSetCount(); theCookieSizes = theServer->cookieValueSize(); if (theServer->cookieSetProb(theCookieSendProb)) { if (theCookieSendProb > 0 && (!theCookieCounts || !theCookieSizes)) { Comment << "error: cookie count and size distributions not " << "specified but cookie_send probability is positive" << endc << xexit; } } else { theCookieSendProb = 0; // no cookies by default if (theCookieCounts || theCookieSizes) { Comment << "error: cookie count and size distributions " << "specified but cookie_send probability is not" << endc << xexit; } } } // merge this with CltCfg::selectAbortCfg() if more methods can be shared void SrvCfg::selectAbortCoord(XactAbortCoord &coord) { static RndGen rng1, rng2; // uncorrelated unless theAbortProb is 1 if (rng1.event(theAbortProb)) { const int whether = rng2.state(); (void)rng2.trial(); coord.configure(rng2.state(), whether); } else { const int whether = rng1.state(); (void)rng1.trial(); coord.configure(whether, rng1.state()); } } bool SrvCfg::setEmbedContType(ObjId &oid, const Area &category) const { int etype = -1; if (theTypes.findEmbedContType(category, etype)) { oid.type(etype); return true; } if (ReportError2(errUnknownEmbedCategory, lgcSrvSide)) Comment << "requested category: " << category << endc; return false; } /* SrvSharedCfgs */ SrvCfg *SrvSharedCfgs::getConfig(const ServerSym *rs) { for (int i = 0; i < count(); ++i) { if (item(i)->theServer == rs) return item(i); } return addConfig(rs); } SrvCfg *SrvSharedCfgs::addConfig(const ServerSym *rs) { SrvCfg *cfg = new SrvCfg; cfg->configure(rs); append(cfg); return cfg; }