#include "../crush.h" using namespace crush; #include #include #include using namespace std; Bucket *make_bucket(Crush& c, vector& wid, int h, int& ndisks) { if (h == 0) { // uniform Hash hash(123); vector disks; for (int i=0; imake_primes(hash); c.add_bucket(b); //cout << h << " uniformbucket with " << wid[h] << " disks" << endl; return b; } else { // mixed MixedBucket *b = new MixedBucket(h+1); for (int i=0; iadd_item(n->get_id(), n->get_weight()); } c.add_bucket(b); //cout << h << " mixedbucket with " << wid[h] << endl; return b; } } int make_hierarchy(Crush& c, vector& wid, int& ndisks) { Bucket *b = make_bucket(c, wid, wid.size()-1, ndisks); return b->get_id(); } Bucket *make_random(Crush& c, int wid, int height, int& ndisks) { int w = rand() % (wid-1) + 2; if (height == 0) { // uniform Hash hash(123); vector disks; for (int i=0; imake_primes(hash); c.add_bucket(b); //cout << h << " uniformbucket with " << wid[h] << " disks" << endl; return b; } else { // mixed int h = rand() % height + 1; MixedBucket *b = new MixedBucket(h+1); for (int i=0; iadd_item(n->get_id(), n->get_weight()); } c.add_bucket(b); //cout << h << " mixedbucket with " << wid[h] << endl; return b; } } float go(int dep, int overloadcutoff) { Hash h(73232313); // crush Crush c; // buckets int root = -1; int ndisks = 0; vector wid; for (int d=0; dget_id(); //c.print(cout, root); } if (0) { MixedBucket *b = new MixedBucket(1); for (int i=0; i<10000; i++) b->add_item(ndisks++, 10); root = c.add_bucket(b); } if (0) { vector disks; for (int i=0; i<10000; i++) disks.push_back(ndisks++); UniformBucket *b = new UniformBucket(1, 0, 10000, disks); Hash h(123); b->make_primes(h); root = c.add_bucket(b); } //cout << ndisks << " disks" << endl; // rule int numrep = 1; Rule rule; rule.steps.push_back(RuleStep(CRUSH_RULE_TAKE, root)); rule.steps.push_back(RuleStep(CRUSH_RULE_CHOOSE, numrep, 0)); rule.steps.push_back(RuleStep(CRUSH_RULE_EMIT)); //c.overload[10] = .1; int pg_per = 100; int numpg = pg_per*ndisks/numrep; vector ocount(ndisks); //cout << ndisks << " disks, " << endl; //cout << pg_per << " pgs per disk" << endl; // cout << numpg << " logical pgs" << endl; //cout << "numrep is " << numrep << endl; int place = 1000000; int times = place / numpg; if (!times) times = 1; //cout << "looping " << times << " times" << endl; float tvar = 0; int tvarnum = 0; float overloadsum = 0.0; float adjustsum = 0.0; float afteroverloadsum = 0.0; int chooses = 0; int xs = 1; for (int t=0; t v(numrep); c.overload.clear(); for (int z=0; z overloadcutoff) overloaded++; if (ocount[i] > 100+(overloadcutoff-100)/2) { adjusted++; c.overload[i] = 100.0 / (float)ocount[i]; //cout << "disk " << i << " has " << ocount[i] << endl; } ocount[i] = 0; } //cout << overloaded << " overloaded" << endl; overloadsum += (float)overloaded / (float)ndisks; adjustsum += (float)adjusted / (float)ndisks; for (int x=xs; x overloadcutoff) { still++; //c.overload[ocount[i]] = 100.0 / (float)ocount[i]; //cout << "disk " << i << " has " << ocount[i] << endl; } } //if (still) cout << "overload was " << overloaded << " now " << still << endl; afteroverloadsum += (float)still / (float)ndisks; //cout << "collisions: " << c.collisions << endl; //cout << "r bumps: " << c.bumps << endl; float avg = 0.0; for (int i=0; i100; d -= 5) { float var = go(3,d); //cout << "## depth = " << d << endl; //cout << d << "\t" << var << endl; } }