if (verbose > 3 )
err << "devices weights (hex): " << hex << weight << dec << std::endl;
-
+ if (output_choose_tries)
+ crush.start_choose_profile();
for (int r = min_rule; r < crush.get_max_rules() && r <= max_rule; r++) {
#endif
}
}
+
+ if (output_choose_tries) {
+ __u32 *v;
+ int n = crush.get_choose_profile(&v);
+ for (int i=0; i<n; i++) {
+ cout.setf(std::ios::right);
+ cout << std::setw(2)
+ << i << ": " << std::setw(9) << v[i];
+ cout.unsetf(std::ios::right);
+ cout << std::endl;
+ }
+
+ crush.stop_choose_profile();
+ }
+
return 0;
}
bool output_utilization_all;
bool output_statistics;
bool output_bad_mappings;
+ bool output_choose_tries;
public:
CrushTester(CrushWrapper& c, ostream& eo, int verbosity=0)
void set_output(bool set_output_utilization,
bool set_output_utilization_all,
bool set_output_statistics,
- bool set_output_bad_mappings) {
+ bool set_output_bad_mappings,
+ bool set_output_choose_tries) {
output_utilization = set_output_utilization;
output_utilization_all = set_output_utilization_all;
output_statistics = set_output_statistics;
output_bad_mappings = set_output_bad_mappings;
+ output_choose_tries = set_output_choose_tries;
}
void set_batches(int b) {
num_batches = b;
crush_finalize(crush);
}
+ void start_choose_profile() {
+ free(crush->choose_tries);
+ crush->choose_tries = (__u32 *)malloc(sizeof(*crush->choose_tries) * crush->choose_total_tries);
+ memset(crush->choose_tries, 0,
+ sizeof(*crush->choose_tries) * crush->choose_total_tries);
+ }
+ void stop_choose_profile() {
+ free(crush->choose_tries);
+ crush->choose_tries = 0;
+ }
+
+ int get_choose_profile(__u32 **vec) {
+ if (crush->choose_tries) {
+ *vec = crush->choose_tries;
+ return crush->choose_total_tries;
+ }
+ return 0;
+ }
+
+
void set_max_devices(int m) {
crush->max_devices = m;
}
cout << " --output utilization-all include zero weight items\n";
cout << " --output-statistics output chi squared statistics\n";
cout << " --output-bad-mappings output bad mappings\n";
+ cout << " --output-choose-tries output choose tries histogram\n";
cout << " --set-choose-local-tries N\n";
cout << " set choose local retries before re-descent\n";
cout << " --set-choose-local-fallback-tries N\n";
bool output_utilization_all = false;
bool output_statistics = false;
bool output_bad_mappings = false;
+ bool output_choose_tries = false;
bool reweight = false;
int add_item = -1;
output_statistics = true;
} else if (ceph_argparse_flag(args, i, "--output_bad_mappings", (char*)NULL)) {
output_bad_mappings = true;
+ } else if (ceph_argparse_flag(args, i, "--output_choose_tries", (char*)NULL)) {
+ output_choose_tries = true;
} else if (ceph_argparse_witharg(args, i, &val, "-c", "--compile", (char*)NULL)) {
srcfn = val;
compile = true;
if (test) {
tester.set_output(output_utilization, output_utilization_all, output_statistics,
- output_bad_mappings);
+ output_bad_mappings, output_choose_tries);
int r = tester.test();
if (r < 0)
exit(1);
--output utilization-all include zero weight items
--output-statistics output chi squared statistics
--output-bad-mappings output bad mappings
+ --output-choose-tries output choose tries histogram
--set-choose-local-tries N
set choose local retries before re-descent
--set-choose-local-fallback-tries N