#include "../crush.h" using namespace crush; #include #include #include using namespace std; int buckettype = 0; Bucket *make_bucket(Crush& c, vector& wid, int h, map< int, list >& buckets, 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; buckets[h].push_back(b); return b; } else { // mixed //Bucket *b = new TreeBucket(h+1); //Bucket *b = new ListBucket(h+1); //Bucket *b = new StrawBucket(h+1); Bucket *b; if (buckettype == 0) b = new TreeBucket(h+1); else if (buckettype == 1 || buckettype == 2) b = new ListBucket(h+1); else if (buckettype == 3) b = new StrawBucket(h+1); c.add_bucket(b); for (int i=0; iadd_item(n->get_id(), n->get_weight()); n->set_parent(b->get_id()); } buckets[h].push_back(b); //cout << b->get_id() << " mixedbucket with " << wid[h] << " at " << h << endl; return b; } } int make_hierarchy(Crush& c, vector& wid, map< int, list >& buckets, int& ndisks) { Bucket *b = make_bucket(c, wid, wid.size()-1, buckets, ndisks); return b->get_id(); } void place(Crush& c, Rule& rule, int numpg, int numrep, map >& placement) { vector v(numrep); map ocount; for (int x=1; x<=numpg; x++) { //cout << H(x) << "\t" << h(x) << endl; c.do_rule(rule, x, v); //cout << "v = " << v << endl;// " " << v[0] << " " << v[1] << " " << v[2] << endl; bool bad = false; for (int i=0; i::iterator it = ocount.begin(); it != ocount.end(); it++) cout << it->first << "\t" << it->second << endl; } float testmovement(int depth, int branching, int udisks, int add, int modifydepth) { Hash h(73232313); // crush Crush c; // buckets int root = -1; int ndisks = 0; vector wid; wid.push_back(udisks); for (int d=1; d > buckets; root = make_hierarchy(c, wid, buckets, ndisks); //c.print(cout,root); // rule int numrep = 2; 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; */ map > placement1, placement2; //c.print(cout, root); // ORIGINAL place(c, rule, numpg, numrep, placement1); int olddisks = ndisks; // add disks //cout << " adding " << add << " disks" << endl; vector disks; for (int i=0; imake_primes(h); //Bucket *o = buckets[2].back(); Bucket *o; if (buckettype == 2) o = buckets[modifydepth].front(); else o = buckets[modifydepth].back(); c.add_bucket(b); //cout << " adding under " << o->get_id() << endl; c.add_item(o->get_id(), b->get_id(), b->get_weight(), buckettype == 2); //((MixedBucket*)o)->add_item(b->get_id(), b->get_weight()); //newbucket = b; // ADDED //c.print(cout, root); place(c, rule, numpg, numrep, placement2); int moved = 0; for (int x=1; x<=numpg; x++) if (placement1[x] != placement2[x]) for (int j=0; j