std::map<int32_t, string> class_name; /* class id -> class name */
std::map<string, int32_t> class_rname; /* class name -> class id */
std::map<int32_t, map<int32_t, int32_t> > class_bucket; /* bucket[id][class] == id */
+ std::map<uint64_t, crush_choose_arg_map> choose_args;
private:
struct crush_map *crush;
~CrushWrapper() {
if (crush)
crush_destroy(crush);
+ choose_args_clear();
}
crush_map *get_crush_map() { return crush; }
void finalize() {
assert(crush);
crush_finalize(crush);
+ choose_args_clear();
}
int update_device_class(CephContext *cct, int id, const string& class_name, const string& name);
return result;
}
+ crush_choose_arg_map choose_args_get(uint64_t choose_args_index) const {
+ auto i = choose_args.find(choose_args_index);
+ if (i == choose_args.end()) {
+ crush_choose_arg_map arg_map;
+ arg_map.args = NULL;
+ arg_map.size = 0;
+ return arg_map;
+ } else {
+ return i->second;
+ }
+ }
+
+ void destroy_choose_args(crush_choose_arg_map arg_map) {
+ for (__u32 i = 0; i < arg_map.size; i++) {
+ crush_choose_arg *arg = &arg_map.args[i];
+ for (__u32 j = 0; j < arg->weight_set_size; j++) {
+ crush_weight_set *weight_set = &arg->weight_set[j];
+ free(weight_set->weights);
+ }
+ if (arg->weight_set)
+ free(arg->weight_set);
+ if (arg->ids)
+ free(arg->ids);
+ }
+ free(arg_map.args);
+ }
+
+ void choose_args_clear() {
+ for (auto w : choose_args)
+ destroy_choose_args(w.second);
+ choose_args.clear();
+ }
+
void do_rule(int rule, int x, vector<int>& out, int maxout,
- const vector<__u32>& weight) const {
+ const vector<__u32>& weight,
+ uint64_t choose_args_index) const {
int rawout[maxout];
char work[crush_work_size(crush, maxout)];
crush_init_workspace(crush, work);
+ crush_choose_arg_map arg_map = choose_args_get(choose_args_index);
int numrep = crush_do_rule(crush, rule, x, rawout, maxout, &weight[0],
- weight.size(), work);
+ weight.size(), work, arg_map.args);
if (numrep < 0)
numrep = 0;
out.resize(numrep);
for (int x = 0; x < 100; ++x) {
vector<int> out;
- c->do_rule(0, x, out, 5, weight);
+ c->do_rule(0, x, out, 5, weight, 0);
cout << x << " -> " << out << std::endl;
int num_none = 0;
for (unsigned i=0; i<out.size(); ++i) {
for (int x = 0; x < 100; ++x) {
vector<int> out;
- c->do_rule(0, x, out, 5, weight);
+ c->do_rule(0, x, out, 5, weight, 0);
cout << x << " -> " << out << std::endl;
int num_none = 0;
for (unsigned i=0; i<out.size(); ++i) {
c->set_choose_total_tries(100);
for (int x = 0; x < 100; ++x) {
vector<int> out;
- c->do_rule(0, x, out, 9, weight);
+ c->do_rule(0, x, out, 9, weight, 0);
cout << x << " -> " << out << std::endl;
int num_none = 0;
for (unsigned i=0; i<out.size(); ++i) {
c->set_choose_total_tries(100);
for (int x = 0; x < 100; ++x) {
vector<int> out;
- c->do_rule(0, x, out, 7, weight);
+ c->do_rule(0, x, out, 7, weight, 0);
cout << x << " -> " << out << std::endl;
int num_none = 0;
for (unsigned i=0; i<out.size(); ++i) {
vector<int> prev;
for (unsigned i=0; i<weight.size(); ++i) {
vector<int> out;
- c->do_rule(0, x, out, 7, weight);
+ c->do_rule(0, x, out, 7, weight, 0);
cout << "(" << i << "/" << weight.size() << " out) "
<< x << " -> " << out << std::endl;
int num_none = 0;
vector<unsigned> reweight(n, 0x10000);
for (int i=0; i<10000; ++i) {
vector<int> out0, out1;
- c->do_rule(ruleset0, i, out0, 1, reweight);
+ c->do_rule(ruleset0, i, out0, 1, reweight, 0);
ASSERT_EQ(1u, out0.size());
- c->do_rule(ruleset1, i, out1, 1, reweight);
+ c->do_rule(ruleset1, i, out1, 1, reweight, 0);
ASSERT_EQ(1u, out1.size());
ASSERT_EQ(out0[0], out1[0]);
//cout << i << "\t" << out0 << "\t" << out1 << std::endl;
int max = 100000;
for (int i=0; i<max; ++i) {
vector<int> out0, out1;
- c->do_rule(ruleset0, i, out0, 1, reweight);
+ c->do_rule(ruleset0, i, out0, 1, reweight, 0);
ASSERT_EQ(1u, out0.size());
- c->do_rule(ruleset1, i, out1, 1, reweight);
+ c->do_rule(ruleset1, i, out1, 1, reweight, 0);
ASSERT_EQ(1u, out1.size());
sum0[out0[0]]++;
sum1[out1[0]]++;
int total = 1000000;
for (int i=0; i<total; ++i) {
vector<int> out;
- c->do_rule(ruleset0, i, out, 1, reweight);
+ c->do_rule(ruleset0, i, out, 1, reweight, 0);
sum[out[0]]++;
}
int total = 1000000;
for (int i=0; i<total; ++i) {
vector<int> out0, out1;
- c->do_rule(ruleset0, i, out0, 1, reweight);
+ c->do_rule(ruleset0, i, out0, 1, reweight, 0);
ASSERT_EQ(1u, out0.size());
- c->do_rule(ruleset1, i, out1, 1, reweight);
+ c->do_rule(ruleset1, i, out1, 1, reweight, 0);
ASSERT_EQ(1u, out1.size());
sum[out1[0]]++;