From 47df377aca39bb9a6e3c0b2ae004e2a2beb7e13d Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 1 Aug 2017 16:39:12 -0400 Subject: [PATCH] crush/CrushTreeDumper: sort tree items by (class, name) Signed-off-by: Sage Weil --- src/crush/CrushTreeDumper.h | 25 ++++++-- src/test/cli/crushtool/arg-order-checks.t | 74 +++++++++++------------ 2 files changed, 58 insertions(+), 41 deletions(-) diff --git a/src/crush/CrushTreeDumper.h b/src/crush/CrushTreeDumper.h index 5bfbc14462369..4a3da9b82ff93 100644 --- a/src/crush/CrushTreeDumper.h +++ b/src/crush/CrushTreeDumper.h @@ -127,16 +127,33 @@ namespace CrushTreeDumper { touched.insert(qi.id); if (qi.is_bucket()) { - // queue bucket contents... + // queue bucket contents, sorted by (class, name) int s = crush->get_bucket_size(qi.id); + map> sorted; for (int k = s - 1; k >= 0; k--) { int id = crush->get_bucket_item(qi.id, k); if (should_dump(id)) { - qi.children.push_back(id); - push_front(Item(id, qi.id, qi.depth + 1, - crush->get_bucket_item_weightf(qi.id, k))); + string sort_by; + if (id >= 0) { + const char *c = crush->get_item_class(id); + sort_by = c ? c : ""; + sort_by += "_"; + char nn[80]; + snprintf(nn, sizeof(nn), "osd.%08d", id); + sort_by += nn; + } else { + sort_by = "_"; + sort_by += crush->get_item_name(id); + } + sorted[sort_by] = make_pair( + id, crush->get_bucket_item_weightf(qi.id, k)); } } + for (auto p = sorted.rbegin(); p != sorted.rend(); ++p) { + qi.children.push_back(p->second.first); + push_front(Item(p->second.first, qi.id, qi.depth + 1, + p->second.second)); + } } return true; } diff --git a/src/test/cli/crushtool/arg-order-checks.t b/src/test/cli/crushtool/arg-order-checks.t index 540bee1807a54..a83e37196c4fa 100644 --- a/src/test/cli/crushtool/arg-order-checks.t +++ b/src/test/cli/crushtool/arg-order-checks.t @@ -6,43 +6,43 @@ $ map="$TESTDIR/foo" $ crushtool --outfn "$map" --build --set-chooseleaf-vary-r 0 --set-chooseleaf-stable 0 --num_osds 25 node straw 5 rack straw 1 root straw 0 --reweight-item osd.2 99 -o "$map" --tree crushtool reweighting item osd.2 to 99 - ID WEIGHT TYPE NAME - -11 123.00000 root root - -6 103.00000 rack rack0 - -1 103.00000 node node0 - 0 1.00000 osd.0 - 1 1.00000 osd.1 - 2 99.00000 osd.2 - 3 1.00000 osd.3 - 4 1.00000 osd.4 - -7 5.00000 rack rack1 - -2 5.00000 node node1 - 5 1.00000 osd.5 - 6 1.00000 osd.6 - 7 1.00000 osd.7 - 8 1.00000 osd.8 - 9 1.00000 osd.9 - -8 5.00000 rack rack2 - -3 5.00000 node node2 - 10 1.00000 osd.10 - 11 1.00000 osd.11 - 12 1.00000 osd.12 - 13 1.00000 osd.13 - 14 1.00000 osd.14 - -9 5.00000 rack rack3 - -4 5.00000 node node3 - 15 1.00000 osd.15 - 16 1.00000 osd.16 - 17 1.00000 osd.17 - 18 1.00000 osd.18 - 19 1.00000 osd.19 - -10 5.00000 rack rack4 - -5 5.00000 node node4 - 20 1.00000 osd.20 - 21 1.00000 osd.21 - 22 1.00000 osd.22 - 23 1.00000 osd.23 - 24 1.00000 osd.24 + ID CLASS WEIGHT TYPE NAME + -11 123.00000 root root + -6 103.00000 rack rack0 + -1 103.00000 node node0 + 0 1.00000 osd.0 + 1 1.00000 osd.1 + 2 99.00000 osd.2 + 3 1.00000 osd.3 + 4 1.00000 osd.4 + -7 5.00000 rack rack1 + -2 5.00000 node node1 + 5 1.00000 osd.5 + 6 1.00000 osd.6 + 7 1.00000 osd.7 + 8 1.00000 osd.8 + 9 1.00000 osd.9 + -8 5.00000 rack rack2 + -3 5.00000 node node2 + 10 1.00000 osd.10 + 11 1.00000 osd.11 + 12 1.00000 osd.12 + 13 1.00000 osd.13 + 14 1.00000 osd.14 + -9 5.00000 rack rack3 + -4 5.00000 node node3 + 15 1.00000 osd.15 + 16 1.00000 osd.16 + 17 1.00000 osd.17 + 18 1.00000 osd.18 + 19 1.00000 osd.19 + -10 5.00000 rack rack4 + -5 5.00000 node node4 + 20 1.00000 osd.20 + 21 1.00000 osd.21 + 22 1.00000 osd.22 + 23 1.00000 osd.23 + 24 1.00000 osd.24 $ crushtool -d "$map" # begin crush map tunable choose_local_tries 0 -- 2.39.5