]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crushtool: add test for crushtool ordering
authorSage Weil <sage@redhat.com>
Sun, 8 Feb 2015 15:47:48 +0000 (07:47 -0800)
committerSage Weil <sage@redhat.com>
Mon, 23 Feb 2015 19:21:25 +0000 (11:21 -0800)
Signed-off-by: Sage Weil <sage@redhat.com>
src/test/cli/crushtool/arg-order-checks.t [new file with mode: 0644]

diff --git a/src/test/cli/crushtool/arg-order-checks.t b/src/test/cli/crushtool/arg-order-checks.t
new file mode 100644 (file)
index 0000000..787bb53
--- /dev/null
@@ -0,0 +1,731 @@
+# tunables before decompile
+  $ crushtool -d "$TESTDIR/simple.template" --set-straw-calc-version 1 | head -2
+  # begin crush map
+  tunable straw_calc_version 1
+# build then reweight-item then tree
+  $ map="$TESTDIR/foo"
+  $ crushtool --outfn "$map" --build --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\tWEIGHT\tTYPE NAME (esc)
+  -11\t123.00000\troot root (esc)
+  -6\t103.00000\t\track rack0 (esc)
+  -1\t103.00000\t\t\tnode node0 (esc)
+  0\t1.00000\t\t\t\tosd.0 (esc)
+  1\t1.00000\t\t\t\tosd.1 (esc)
+  2\t99.00000\t\t\t\tosd.2 (esc)
+  3\t1.00000\t\t\t\tosd.3 (esc)
+  4\t1.00000\t\t\t\tosd.4 (esc)
+  -7\t5.00000\t\track rack1 (esc)
+  -2\t5.00000\t\t\tnode node1 (esc)
+  5\t1.00000\t\t\t\tosd.5 (esc)
+  6\t1.00000\t\t\t\tosd.6 (esc)
+  7\t1.00000\t\t\t\tosd.7 (esc)
+  8\t1.00000\t\t\t\tosd.8 (esc)
+  9\t1.00000\t\t\t\tosd.9 (esc)
+  -8\t5.00000\t\track rack2 (esc)
+  -3\t5.00000\t\t\tnode node2 (esc)
+  10\t1.00000\t\t\t\tosd.10 (esc)
+  11\t1.00000\t\t\t\tosd.11 (esc)
+  12\t1.00000\t\t\t\tosd.12 (esc)
+  13\t1.00000\t\t\t\tosd.13 (esc)
+  14\t1.00000\t\t\t\tosd.14 (esc)
+  -9\t5.00000\t\track rack3 (esc)
+  -4\t5.00000\t\t\tnode node3 (esc)
+  15\t1.00000\t\t\t\tosd.15 (esc)
+  16\t1.00000\t\t\t\tosd.16 (esc)
+  17\t1.00000\t\t\t\tosd.17 (esc)
+  18\t1.00000\t\t\t\tosd.18 (esc)
+  19\t1.00000\t\t\t\tosd.19 (esc)
+  -10\t5.00000\t\track rack4 (esc)
+  -5\t5.00000\t\t\tnode node4 (esc)
+  20\t1.00000\t\t\t\tosd.20 (esc)
+  21\t1.00000\t\t\t\tosd.21 (esc)
+  22\t1.00000\t\t\t\tosd.22 (esc)
+  23\t1.00000\t\t\t\tosd.23 (esc)
+  24\t1.00000\t\t\t\tosd.24 (esc)
+  $ crushtool -d "$map"
+  # begin crush map
+  tunable choose_local_tries 0
+  tunable choose_local_fallback_tries 0
+  tunable choose_total_tries 50
+  tunable chooseleaf_descend_once 1
+  tunable straw_calc_version 1
+  
+  # devices
+  device 0 osd.0
+  device 1 osd.1
+  device 2 osd.2
+  device 3 osd.3
+  device 4 osd.4
+  device 5 osd.5
+  device 6 osd.6
+  device 7 osd.7
+  device 8 osd.8
+  device 9 osd.9
+  device 10 osd.10
+  device 11 osd.11
+  device 12 osd.12
+  device 13 osd.13
+  device 14 osd.14
+  device 15 osd.15
+  device 16 osd.16
+  device 17 osd.17
+  device 18 osd.18
+  device 19 osd.19
+  device 20 osd.20
+  device 21 osd.21
+  device 22 osd.22
+  device 23 osd.23
+  device 24 osd.24
+  
+  # types
+  type 0 device
+  type 1 node
+  type 2 rack
+  type 3 root
+  
+  # buckets
+  node node0 {
+  \tid -1\t\t# do not change unnecessarily (esc)
+  \t# weight 103.000 (esc)
+  \talg straw (esc)
+  \thash 0\t# rjenkins1 (esc)
+  \titem osd.0 weight 1.000 (esc)
+  \titem osd.1 weight 1.000 (esc)
+  \titem osd.2 weight 99.000 (esc)
+  \titem osd.3 weight 1.000 (esc)
+  \titem osd.4 weight 1.000 (esc)
+  }
+  node node1 {
+  \tid -2\t\t# do not change unnecessarily (esc)
+  \t# weight 5.000 (esc)
+  \talg straw (esc)
+  \thash 0\t# rjenkins1 (esc)
+  \titem osd.5 weight 1.000 (esc)
+  \titem osd.6 weight 1.000 (esc)
+  \titem osd.7 weight 1.000 (esc)
+  \titem osd.8 weight 1.000 (esc)
+  \titem osd.9 weight 1.000 (esc)
+  }
+  node node2 {
+  \tid -3\t\t# do not change unnecessarily (esc)
+  \t# weight 5.000 (esc)
+  \talg straw (esc)
+  \thash 0\t# rjenkins1 (esc)
+  \titem osd.10 weight 1.000 (esc)
+  \titem osd.11 weight 1.000 (esc)
+  \titem osd.12 weight 1.000 (esc)
+  \titem osd.13 weight 1.000 (esc)
+  \titem osd.14 weight 1.000 (esc)
+  }
+  node node3 {
+  \tid -4\t\t# do not change unnecessarily (esc)
+  \t# weight 5.000 (esc)
+  \talg straw (esc)
+  \thash 0\t# rjenkins1 (esc)
+  \titem osd.15 weight 1.000 (esc)
+  \titem osd.16 weight 1.000 (esc)
+  \titem osd.17 weight 1.000 (esc)
+  \titem osd.18 weight 1.000 (esc)
+  \titem osd.19 weight 1.000 (esc)
+  }
+  node node4 {
+  \tid -5\t\t# do not change unnecessarily (esc)
+  \t# weight 5.000 (esc)
+  \talg straw (esc)
+  \thash 0\t# rjenkins1 (esc)
+  \titem osd.20 weight 1.000 (esc)
+  \titem osd.21 weight 1.000 (esc)
+  \titem osd.22 weight 1.000 (esc)
+  \titem osd.23 weight 1.000 (esc)
+  \titem osd.24 weight 1.000 (esc)
+  }
+  rack rack0 {
+  \tid -6\t\t# do not change unnecessarily (esc)
+  \t# weight 103.000 (esc)
+  \talg straw (esc)
+  \thash 0\t# rjenkins1 (esc)
+  \titem node0 weight 103.000 (esc)
+  }
+  rack rack1 {
+  \tid -7\t\t# do not change unnecessarily (esc)
+  \t# weight 5.000 (esc)
+  \talg straw (esc)
+  \thash 0\t# rjenkins1 (esc)
+  \titem node1 weight 5.000 (esc)
+  }
+  rack rack2 {
+  \tid -8\t\t# do not change unnecessarily (esc)
+  \t# weight 5.000 (esc)
+  \talg straw (esc)
+  \thash 0\t# rjenkins1 (esc)
+  \titem node2 weight 5.000 (esc)
+  }
+  rack rack3 {
+  \tid -9\t\t# do not change unnecessarily (esc)
+  \t# weight 5.000 (esc)
+  \talg straw (esc)
+  \thash 0\t# rjenkins1 (esc)
+  \titem node3 weight 5.000 (esc)
+  }
+  rack rack4 {
+  \tid -10\t\t# do not change unnecessarily (esc)
+  \t# weight 5.000 (esc)
+  \talg straw (esc)
+  \thash 0\t# rjenkins1 (esc)
+  \titem node4 weight 5.000 (esc)
+  }
+  root root {
+  \tid -11\t\t# do not change unnecessarily (esc)
+  \t# weight 123.000 (esc)
+  \talg straw (esc)
+  \thash 0\t# rjenkins1 (esc)
+  \titem rack0 weight 103.000 (esc)
+  \titem rack1 weight 5.000 (esc)
+  \titem rack2 weight 5.000 (esc)
+  \titem rack3 weight 5.000 (esc)
+  \titem rack4 weight 5.000 (esc)
+  }
+  
+  # rules
+  rule replicated_ruleset {
+  \truleset 0 (esc)
+  \ttype replicated (esc)
+  \tmin_size 1 (esc)
+  \tmax_size 10 (esc)
+  \tstep take root (esc)
+  \tstep chooseleaf firstn 0 type node (esc)
+  \tstep emit (esc)
+  }
+  
+  # end crush map
+# tunables before reweight
+  $ crushtool -i "$map" --set-straw-calc-version 0 --reweight --test --show-utilization --max-x 100 --min-x 1
+  rule 0 (replicated_ruleset), x = 1..100, numrep = 1..10
+  rule 0 (replicated_ruleset) num_rep 1 result size == 1:\t100/100 (esc)
+    device 0:\t\t stored : 4\t expected : 4 (esc)
+    device 1:\t\t stored : 4\t expected : 4 (esc)
+    device 2:\t\t stored : 40\t expected : 4 (esc)
+    device 3:\t\t stored : 6\t expected : 4 (esc)
+    device 4:\t\t stored : 1\t expected : 4 (esc)
+    device 5:\t\t stored : 2\t expected : 4 (esc)
+    device 7:\t\t stored : 2\t expected : 4 (esc)
+    device 8:\t\t stored : 3\t expected : 4 (esc)
+    device 9:\t\t stored : 4\t expected : 4 (esc)
+    device 12:\t\t stored : 2\t expected : 4 (esc)
+    device 13:\t\t stored : 1\t expected : 4 (esc)
+    device 14:\t\t stored : 4\t expected : 4 (esc)
+    device 15:\t\t stored : 2\t expected : 4 (esc)
+    device 16:\t\t stored : 5\t expected : 4 (esc)
+    device 17:\t\t stored : 3\t expected : 4 (esc)
+    device 19:\t\t stored : 5\t expected : 4 (esc)
+    device 20:\t\t stored : 5\t expected : 4 (esc)
+    device 21:\t\t stored : 1\t expected : 4 (esc)
+    device 22:\t\t stored : 2\t expected : 4 (esc)
+    device 23:\t\t stored : 2\t expected : 4 (esc)
+    device 24:\t\t stored : 2\t expected : 4 (esc)
+  rule 0 (replicated_ruleset) num_rep 2 result size == 2:\t100/100 (esc)
+    device 0:\t\t stored : 6\t expected : 8 (esc)
+    device 1:\t\t stored : 6\t expected : 8 (esc)
+    device 2:\t\t stored : 60\t expected : 8 (esc)
+    device 3:\t\t stored : 6\t expected : 8 (esc)
+    device 4:\t\t stored : 6\t expected : 8 (esc)
+    device 5:\t\t stored : 4\t expected : 8 (esc)
+    device 6:\t\t stored : 2\t expected : 8 (esc)
+    device 7:\t\t stored : 4\t expected : 8 (esc)
+    device 8:\t\t stored : 5\t expected : 8 (esc)
+    device 9:\t\t stored : 10\t expected : 8 (esc)
+    device 10:\t\t stored : 3\t expected : 8 (esc)
+    device 11:\t\t stored : 5\t expected : 8 (esc)
+    device 12:\t\t stored : 6\t expected : 8 (esc)
+    device 13:\t\t stored : 3\t expected : 8 (esc)
+    device 14:\t\t stored : 7\t expected : 8 (esc)
+    device 15:\t\t stored : 8\t expected : 8 (esc)
+    device 16:\t\t stored : 7\t expected : 8 (esc)
+    device 17:\t\t stored : 7\t expected : 8 (esc)
+    device 18:\t\t stored : 6\t expected : 8 (esc)
+    device 19:\t\t stored : 11\t expected : 8 (esc)
+    device 20:\t\t stored : 12\t expected : 8 (esc)
+    device 21:\t\t stored : 1\t expected : 8 (esc)
+    device 22:\t\t stored : 4\t expected : 8 (esc)
+    device 23:\t\t stored : 5\t expected : 8 (esc)
+    device 24:\t\t stored : 6\t expected : 8 (esc)
+  rule 0 (replicated_ruleset) num_rep 3 result size == 3:\t100/100 (esc)
+    device 0:\t\t stored : 8\t expected : 12 (esc)
+    device 1:\t\t stored : 6\t expected : 12 (esc)
+    device 2:\t\t stored : 69\t expected : 12 (esc)
+    device 3:\t\t stored : 6\t expected : 12 (esc)
+    device 4:\t\t stored : 6\t expected : 12 (esc)
+    device 5:\t\t stored : 8\t expected : 12 (esc)
+    device 6:\t\t stored : 9\t expected : 12 (esc)
+    device 7:\t\t stored : 7\t expected : 12 (esc)
+    device 8:\t\t stored : 14\t expected : 12 (esc)
+    device 9:\t\t stored : 16\t expected : 12 (esc)
+    device 10:\t\t stored : 6\t expected : 12 (esc)
+    device 11:\t\t stored : 11\t expected : 12 (esc)
+    device 12:\t\t stored : 9\t expected : 12 (esc)
+    device 13:\t\t stored : 8\t expected : 12 (esc)
+    device 14:\t\t stored : 7\t expected : 12 (esc)
+    device 15:\t\t stored : 8\t expected : 12 (esc)
+    device 16:\t\t stored : 9\t expected : 12 (esc)
+    device 17:\t\t stored : 11\t expected : 12 (esc)
+    device 18:\t\t stored : 9\t expected : 12 (esc)
+    device 19:\t\t stored : 16\t expected : 12 (esc)
+    device 20:\t\t stored : 18\t expected : 12 (esc)
+    device 21:\t\t stored : 5\t expected : 12 (esc)
+    device 22:\t\t stored : 15\t expected : 12 (esc)
+    device 23:\t\t stored : 8\t expected : 12 (esc)
+    device 24:\t\t stored : 11\t expected : 12 (esc)
+  rule 0 (replicated_ruleset) num_rep 4 result size == 4:\t100/100 (esc)
+    device 0:\t\t stored : 8\t expected : 16 (esc)
+    device 1:\t\t stored : 6\t expected : 16 (esc)
+    device 2:\t\t stored : 72\t expected : 16 (esc)
+    device 3:\t\t stored : 6\t expected : 16 (esc)
+    device 4:\t\t stored : 6\t expected : 16 (esc)
+    device 5:\t\t stored : 13\t expected : 16 (esc)
+    device 6:\t\t stored : 13\t expected : 16 (esc)
+    device 7:\t\t stored : 13\t expected : 16 (esc)
+    device 8:\t\t stored : 15\t expected : 16 (esc)
+    device 9:\t\t stored : 20\t expected : 16 (esc)
+    device 10:\t\t stored : 11\t expected : 16 (esc)
+    device 11:\t\t stored : 20\t expected : 16 (esc)
+    device 12:\t\t stored : 13\t expected : 16 (esc)
+    device 13:\t\t stored : 13\t expected : 16 (esc)
+    device 14:\t\t stored : 11\t expected : 16 (esc)
+    device 15:\t\t stored : 19\t expected : 16 (esc)
+    device 16:\t\t stored : 12\t expected : 16 (esc)
+    device 17:\t\t stored : 13\t expected : 16 (esc)
+    device 18:\t\t stored : 17\t expected : 16 (esc)
+    device 19:\t\t stored : 22\t expected : 16 (esc)
+    device 20:\t\t stored : 21\t expected : 16 (esc)
+    device 21:\t\t stored : 11\t expected : 16 (esc)
+    device 22:\t\t stored : 20\t expected : 16 (esc)
+    device 23:\t\t stored : 10\t expected : 16 (esc)
+    device 24:\t\t stored : 15\t expected : 16 (esc)
+  rule 0 (replicated_ruleset) num_rep 5 result size == 4:\t3/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 5 result size == 5:\t97/100 (esc)
+    device 0:\t\t stored : 8\t expected : 20 (esc)
+    device 1:\t\t stored : 6\t expected : 20 (esc)
+    device 2:\t\t stored : 74\t expected : 20 (esc)
+    device 3:\t\t stored : 6\t expected : 20 (esc)
+    device 4:\t\t stored : 6\t expected : 20 (esc)
+    device 5:\t\t stored : 17\t expected : 20 (esc)
+    device 6:\t\t stored : 17\t expected : 20 (esc)
+    device 7:\t\t stored : 19\t expected : 20 (esc)
+    device 8:\t\t stored : 18\t expected : 20 (esc)
+    device 9:\t\t stored : 27\t expected : 20 (esc)
+    device 10:\t\t stored : 15\t expected : 20 (esc)
+    device 11:\t\t stored : 28\t expected : 20 (esc)
+    device 12:\t\t stored : 22\t expected : 20 (esc)
+    device 13:\t\t stored : 18\t expected : 20 (esc)
+    device 14:\t\t stored : 17\t expected : 20 (esc)
+    device 15:\t\t stored : 22\t expected : 20 (esc)
+    device 16:\t\t stored : 14\t expected : 20 (esc)
+    device 17:\t\t stored : 19\t expected : 20 (esc)
+    device 18:\t\t stored : 20\t expected : 20 (esc)
+    device 19:\t\t stored : 25\t expected : 20 (esc)
+    device 20:\t\t stored : 24\t expected : 20 (esc)
+    device 21:\t\t stored : 19\t expected : 20 (esc)
+    device 22:\t\t stored : 25\t expected : 20 (esc)
+    device 23:\t\t stored : 13\t expected : 20 (esc)
+    device 24:\t\t stored : 18\t expected : 20 (esc)
+  rule 0 (replicated_ruleset) num_rep 6 result size == 4:\t3/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 6 result size == 5:\t97/100 (esc)
+    device 0:\t\t stored : 8\t expected : 20 (esc)
+    device 1:\t\t stored : 6\t expected : 20 (esc)
+    device 2:\t\t stored : 74\t expected : 20 (esc)
+    device 3:\t\t stored : 6\t expected : 20 (esc)
+    device 4:\t\t stored : 6\t expected : 20 (esc)
+    device 5:\t\t stored : 17\t expected : 20 (esc)
+    device 6:\t\t stored : 17\t expected : 20 (esc)
+    device 7:\t\t stored : 19\t expected : 20 (esc)
+    device 8:\t\t stored : 18\t expected : 20 (esc)
+    device 9:\t\t stored : 27\t expected : 20 (esc)
+    device 10:\t\t stored : 15\t expected : 20 (esc)
+    device 11:\t\t stored : 28\t expected : 20 (esc)
+    device 12:\t\t stored : 22\t expected : 20 (esc)
+    device 13:\t\t stored : 18\t expected : 20 (esc)
+    device 14:\t\t stored : 17\t expected : 20 (esc)
+    device 15:\t\t stored : 22\t expected : 20 (esc)
+    device 16:\t\t stored : 14\t expected : 20 (esc)
+    device 17:\t\t stored : 19\t expected : 20 (esc)
+    device 18:\t\t stored : 20\t expected : 20 (esc)
+    device 19:\t\t stored : 25\t expected : 20 (esc)
+    device 20:\t\t stored : 24\t expected : 20 (esc)
+    device 21:\t\t stored : 19\t expected : 20 (esc)
+    device 22:\t\t stored : 25\t expected : 20 (esc)
+    device 23:\t\t stored : 13\t expected : 20 (esc)
+    device 24:\t\t stored : 18\t expected : 20 (esc)
+  rule 0 (replicated_ruleset) num_rep 7 result size == 4:\t3/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 7 result size == 5:\t97/100 (esc)
+    device 0:\t\t stored : 8\t expected : 20 (esc)
+    device 1:\t\t stored : 6\t expected : 20 (esc)
+    device 2:\t\t stored : 74\t expected : 20 (esc)
+    device 3:\t\t stored : 6\t expected : 20 (esc)
+    device 4:\t\t stored : 6\t expected : 20 (esc)
+    device 5:\t\t stored : 17\t expected : 20 (esc)
+    device 6:\t\t stored : 17\t expected : 20 (esc)
+    device 7:\t\t stored : 19\t expected : 20 (esc)
+    device 8:\t\t stored : 18\t expected : 20 (esc)
+    device 9:\t\t stored : 27\t expected : 20 (esc)
+    device 10:\t\t stored : 15\t expected : 20 (esc)
+    device 11:\t\t stored : 28\t expected : 20 (esc)
+    device 12:\t\t stored : 22\t expected : 20 (esc)
+    device 13:\t\t stored : 18\t expected : 20 (esc)
+    device 14:\t\t stored : 17\t expected : 20 (esc)
+    device 15:\t\t stored : 22\t expected : 20 (esc)
+    device 16:\t\t stored : 14\t expected : 20 (esc)
+    device 17:\t\t stored : 19\t expected : 20 (esc)
+    device 18:\t\t stored : 20\t expected : 20 (esc)
+    device 19:\t\t stored : 25\t expected : 20 (esc)
+    device 20:\t\t stored : 24\t expected : 20 (esc)
+    device 21:\t\t stored : 19\t expected : 20 (esc)
+    device 22:\t\t stored : 25\t expected : 20 (esc)
+    device 23:\t\t stored : 13\t expected : 20 (esc)
+    device 24:\t\t stored : 18\t expected : 20 (esc)
+  rule 0 (replicated_ruleset) num_rep 8 result size == 4:\t3/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 8 result size == 5:\t97/100 (esc)
+    device 0:\t\t stored : 8\t expected : 20 (esc)
+    device 1:\t\t stored : 6\t expected : 20 (esc)
+    device 2:\t\t stored : 74\t expected : 20 (esc)
+    device 3:\t\t stored : 6\t expected : 20 (esc)
+    device 4:\t\t stored : 6\t expected : 20 (esc)
+    device 5:\t\t stored : 17\t expected : 20 (esc)
+    device 6:\t\t stored : 17\t expected : 20 (esc)
+    device 7:\t\t stored : 19\t expected : 20 (esc)
+    device 8:\t\t stored : 18\t expected : 20 (esc)
+    device 9:\t\t stored : 27\t expected : 20 (esc)
+    device 10:\t\t stored : 15\t expected : 20 (esc)
+    device 11:\t\t stored : 28\t expected : 20 (esc)
+    device 12:\t\t stored : 22\t expected : 20 (esc)
+    device 13:\t\t stored : 18\t expected : 20 (esc)
+    device 14:\t\t stored : 17\t expected : 20 (esc)
+    device 15:\t\t stored : 22\t expected : 20 (esc)
+    device 16:\t\t stored : 14\t expected : 20 (esc)
+    device 17:\t\t stored : 19\t expected : 20 (esc)
+    device 18:\t\t stored : 20\t expected : 20 (esc)
+    device 19:\t\t stored : 25\t expected : 20 (esc)
+    device 20:\t\t stored : 24\t expected : 20 (esc)
+    device 21:\t\t stored : 19\t expected : 20 (esc)
+    device 22:\t\t stored : 25\t expected : 20 (esc)
+    device 23:\t\t stored : 13\t expected : 20 (esc)
+    device 24:\t\t stored : 18\t expected : 20 (esc)
+  rule 0 (replicated_ruleset) num_rep 9 result size == 4:\t2/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 9 result size == 5:\t98/100 (esc)
+    device 0:\t\t stored : 8\t expected : 20 (esc)
+    device 1:\t\t stored : 6\t expected : 20 (esc)
+    device 2:\t\t stored : 74\t expected : 20 (esc)
+    device 3:\t\t stored : 6\t expected : 20 (esc)
+    device 4:\t\t stored : 6\t expected : 20 (esc)
+    device 5:\t\t stored : 17\t expected : 20 (esc)
+    device 6:\t\t stored : 17\t expected : 20 (esc)
+    device 7:\t\t stored : 19\t expected : 20 (esc)
+    device 8:\t\t stored : 18\t expected : 20 (esc)
+    device 9:\t\t stored : 28\t expected : 20 (esc)
+    device 10:\t\t stored : 15\t expected : 20 (esc)
+    device 11:\t\t stored : 28\t expected : 20 (esc)
+    device 12:\t\t stored : 22\t expected : 20 (esc)
+    device 13:\t\t stored : 18\t expected : 20 (esc)
+    device 14:\t\t stored : 17\t expected : 20 (esc)
+    device 15:\t\t stored : 22\t expected : 20 (esc)
+    device 16:\t\t stored : 14\t expected : 20 (esc)
+    device 17:\t\t stored : 19\t expected : 20 (esc)
+    device 18:\t\t stored : 20\t expected : 20 (esc)
+    device 19:\t\t stored : 25\t expected : 20 (esc)
+    device 20:\t\t stored : 24\t expected : 20 (esc)
+    device 21:\t\t stored : 19\t expected : 20 (esc)
+    device 22:\t\t stored : 25\t expected : 20 (esc)
+    device 23:\t\t stored : 13\t expected : 20 (esc)
+    device 24:\t\t stored : 18\t expected : 20 (esc)
+  rule 0 (replicated_ruleset) num_rep 10 result size == 4:\t2/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 10 result size == 5:\t98/100 (esc)
+    device 0:\t\t stored : 8\t expected : 20 (esc)
+    device 1:\t\t stored : 6\t expected : 20 (esc)
+    device 2:\t\t stored : 74\t expected : 20 (esc)
+    device 3:\t\t stored : 6\t expected : 20 (esc)
+    device 4:\t\t stored : 6\t expected : 20 (esc)
+    device 5:\t\t stored : 17\t expected : 20 (esc)
+    device 6:\t\t stored : 17\t expected : 20 (esc)
+    device 7:\t\t stored : 19\t expected : 20 (esc)
+    device 8:\t\t stored : 18\t expected : 20 (esc)
+    device 9:\t\t stored : 28\t expected : 20 (esc)
+    device 10:\t\t stored : 15\t expected : 20 (esc)
+    device 11:\t\t stored : 28\t expected : 20 (esc)
+    device 12:\t\t stored : 22\t expected : 20 (esc)
+    device 13:\t\t stored : 18\t expected : 20 (esc)
+    device 14:\t\t stored : 17\t expected : 20 (esc)
+    device 15:\t\t stored : 22\t expected : 20 (esc)
+    device 16:\t\t stored : 14\t expected : 20 (esc)
+    device 17:\t\t stored : 19\t expected : 20 (esc)
+    device 18:\t\t stored : 20\t expected : 20 (esc)
+    device 19:\t\t stored : 25\t expected : 20 (esc)
+    device 20:\t\t stored : 24\t expected : 20 (esc)
+    device 21:\t\t stored : 19\t expected : 20 (esc)
+    device 22:\t\t stored : 25\t expected : 20 (esc)
+    device 23:\t\t stored : 13\t expected : 20 (esc)
+    device 24:\t\t stored : 18\t expected : 20 (esc)
+  crushtool successfully built or modified map.  Use '-o <file>' to write it out.
+  $ crushtool -i "$map" --set-straw-calc-version 1 --reweight --test --show-utilization --max-x 100 --min-x 1
+  rule 0 (replicated_ruleset), x = 1..100, numrep = 1..10
+  rule 0 (replicated_ruleset) num_rep 1 result size == 1:\t100/100 (esc)
+    device 1:\t\t stored : 1\t expected : 4 (esc)
+    device 2:\t\t stored : 75\t expected : 4 (esc)
+    device 3:\t\t stored : 2\t expected : 4 (esc)
+    device 4:\t\t stored : 1\t expected : 4 (esc)
+    device 5:\t\t stored : 2\t expected : 4 (esc)
+    device 7:\t\t stored : 2\t expected : 4 (esc)
+    device 8:\t\t stored : 1\t expected : 4 (esc)
+    device 9:\t\t stored : 2\t expected : 4 (esc)
+    device 14:\t\t stored : 3\t expected : 4 (esc)
+    device 16:\t\t stored : 3\t expected : 4 (esc)
+    device 19:\t\t stored : 4\t expected : 4 (esc)
+    device 20:\t\t stored : 2\t expected : 4 (esc)
+    device 22:\t\t stored : 1\t expected : 4 (esc)
+    device 23:\t\t stored : 1\t expected : 4 (esc)
+  rule 0 (replicated_ruleset) num_rep 2 result size == 2:\t100/100 (esc)
+    device 0:\t\t stored : 1\t expected : 8 (esc)
+    device 1:\t\t stored : 1\t expected : 8 (esc)
+    device 2:\t\t stored : 95\t expected : 8 (esc)
+    device 3:\t\t stored : 2\t expected : 8 (esc)
+    device 4:\t\t stored : 1\t expected : 8 (esc)
+    device 5:\t\t stored : 3\t expected : 8 (esc)
+    device 6:\t\t stored : 3\t expected : 8 (esc)
+    device 7:\t\t stored : 7\t expected : 8 (esc)
+    device 8:\t\t stored : 4\t expected : 8 (esc)
+    device 9:\t\t stored : 8\t expected : 8 (esc)
+    device 11:\t\t stored : 1\t expected : 8 (esc)
+    device 12:\t\t stored : 4\t expected : 8 (esc)
+    device 13:\t\t stored : 2\t expected : 8 (esc)
+    device 14:\t\t stored : 6\t expected : 8 (esc)
+    device 15:\t\t stored : 5\t expected : 8 (esc)
+    device 16:\t\t stored : 4\t expected : 8 (esc)
+    device 17:\t\t stored : 8\t expected : 8 (esc)
+    device 18:\t\t stored : 5\t expected : 8 (esc)
+    device 19:\t\t stored : 9\t expected : 8 (esc)
+    device 20:\t\t stored : 7\t expected : 8 (esc)
+    device 21:\t\t stored : 5\t expected : 8 (esc)
+    device 22:\t\t stored : 6\t expected : 8 (esc)
+    device 23:\t\t stored : 5\t expected : 8 (esc)
+    device 24:\t\t stored : 8\t expected : 8 (esc)
+  rule 0 (replicated_ruleset) num_rep 3 result size == 3:\t100/100 (esc)
+    device 0:\t\t stored : 1\t expected : 12 (esc)
+    device 1:\t\t stored : 1\t expected : 12 (esc)
+    device 2:\t\t stored : 95\t expected : 12 (esc)
+    device 3:\t\t stored : 2\t expected : 12 (esc)
+    device 4:\t\t stored : 1\t expected : 12 (esc)
+    device 5:\t\t stored : 4\t expected : 12 (esc)
+    device 6:\t\t stored : 5\t expected : 12 (esc)
+    device 7:\t\t stored : 10\t expected : 12 (esc)
+    device 8:\t\t stored : 16\t expected : 12 (esc)
+    device 9:\t\t stored : 13\t expected : 12 (esc)
+    device 10:\t\t stored : 8\t expected : 12 (esc)
+    device 11:\t\t stored : 5\t expected : 12 (esc)
+    device 12:\t\t stored : 5\t expected : 12 (esc)
+    device 13:\t\t stored : 5\t expected : 12 (esc)
+    device 14:\t\t stored : 8\t expected : 12 (esc)
+    device 15:\t\t stored : 11\t expected : 12 (esc)
+    device 16:\t\t stored : 17\t expected : 12 (esc)
+    device 17:\t\t stored : 12\t expected : 12 (esc)
+    device 18:\t\t stored : 9\t expected : 12 (esc)
+    device 19:\t\t stored : 15\t expected : 12 (esc)
+    device 20:\t\t stored : 16\t expected : 12 (esc)
+    device 21:\t\t stored : 8\t expected : 12 (esc)
+    device 22:\t\t stored : 11\t expected : 12 (esc)
+    device 23:\t\t stored : 11\t expected : 12 (esc)
+    device 24:\t\t stored : 11\t expected : 12 (esc)
+  rule 0 (replicated_ruleset) num_rep 4 result size == 3:\t3/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 4 result size == 4:\t97/100 (esc)
+    device 0:\t\t stored : 1\t expected : 16 (esc)
+    device 1:\t\t stored : 1\t expected : 16 (esc)
+    device 2:\t\t stored : 95\t expected : 16 (esc)
+    device 3:\t\t stored : 2\t expected : 16 (esc)
+    device 4:\t\t stored : 1\t expected : 16 (esc)
+    device 5:\t\t stored : 11\t expected : 16 (esc)
+    device 6:\t\t stored : 12\t expected : 16 (esc)
+    device 7:\t\t stored : 16\t expected : 16 (esc)
+    device 8:\t\t stored : 19\t expected : 16 (esc)
+    device 9:\t\t stored : 18\t expected : 16 (esc)
+    device 10:\t\t stored : 12\t expected : 16 (esc)
+    device 11:\t\t stored : 12\t expected : 16 (esc)
+    device 12:\t\t stored : 13\t expected : 16 (esc)
+    device 13:\t\t stored : 11\t expected : 16 (esc)
+    device 14:\t\t stored : 16\t expected : 16 (esc)
+    device 15:\t\t stored : 19\t expected : 16 (esc)
+    device 16:\t\t stored : 19\t expected : 16 (esc)
+    device 17:\t\t stored : 15\t expected : 16 (esc)
+    device 18:\t\t stored : 11\t expected : 16 (esc)
+    device 19:\t\t stored : 18\t expected : 16 (esc)
+    device 20:\t\t stored : 22\t expected : 16 (esc)
+    device 21:\t\t stored : 12\t expected : 16 (esc)
+    device 22:\t\t stored : 14\t expected : 16 (esc)
+    device 23:\t\t stored : 13\t expected : 16 (esc)
+    device 24:\t\t stored : 14\t expected : 16 (esc)
+  rule 0 (replicated_ruleset) num_rep 5 result size == 3:\t3/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 5 result size == 4:\t43/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 5 result size == 5:\t54/100 (esc)
+    device 0:\t\t stored : 1\t expected : 20 (esc)
+    device 1:\t\t stored : 1\t expected : 20 (esc)
+    device 2:\t\t stored : 95\t expected : 20 (esc)
+    device 3:\t\t stored : 2\t expected : 20 (esc)
+    device 4:\t\t stored : 1\t expected : 20 (esc)
+    device 5:\t\t stored : 14\t expected : 20 (esc)
+    device 6:\t\t stored : 14\t expected : 20 (esc)
+    device 7:\t\t stored : 16\t expected : 20 (esc)
+    device 8:\t\t stored : 19\t expected : 20 (esc)
+    device 9:\t\t stored : 22\t expected : 20 (esc)
+    device 10:\t\t stored : 15\t expected : 20 (esc)
+    device 11:\t\t stored : 16\t expected : 20 (esc)
+    device 12:\t\t stored : 17\t expected : 20 (esc)
+    device 13:\t\t stored : 18\t expected : 20 (esc)
+    device 14:\t\t stored : 19\t expected : 20 (esc)
+    device 15:\t\t stored : 19\t expected : 20 (esc)
+    device 16:\t\t stored : 20\t expected : 20 (esc)
+    device 17:\t\t stored : 17\t expected : 20 (esc)
+    device 18:\t\t stored : 15\t expected : 20 (esc)
+    device 19:\t\t stored : 20\t expected : 20 (esc)
+    device 20:\t\t stored : 26\t expected : 20 (esc)
+    device 21:\t\t stored : 17\t expected : 20 (esc)
+    device 22:\t\t stored : 16\t expected : 20 (esc)
+    device 23:\t\t stored : 15\t expected : 20 (esc)
+    device 24:\t\t stored : 16\t expected : 20 (esc)
+  rule 0 (replicated_ruleset) num_rep 6 result size == 3:\t2/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 6 result size == 4:\t43/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 6 result size == 5:\t55/100 (esc)
+    device 0:\t\t stored : 1\t expected : 20 (esc)
+    device 1:\t\t stored : 1\t expected : 20 (esc)
+    device 2:\t\t stored : 95\t expected : 20 (esc)
+    device 3:\t\t stored : 2\t expected : 20 (esc)
+    device 4:\t\t stored : 1\t expected : 20 (esc)
+    device 5:\t\t stored : 14\t expected : 20 (esc)
+    device 6:\t\t stored : 14\t expected : 20 (esc)
+    device 7:\t\t stored : 16\t expected : 20 (esc)
+    device 8:\t\t stored : 19\t expected : 20 (esc)
+    device 9:\t\t stored : 22\t expected : 20 (esc)
+    device 10:\t\t stored : 15\t expected : 20 (esc)
+    device 11:\t\t stored : 16\t expected : 20 (esc)
+    device 12:\t\t stored : 17\t expected : 20 (esc)
+    device 13:\t\t stored : 18\t expected : 20 (esc)
+    device 14:\t\t stored : 20\t expected : 20 (esc)
+    device 15:\t\t stored : 19\t expected : 20 (esc)
+    device 16:\t\t stored : 20\t expected : 20 (esc)
+    device 17:\t\t stored : 17\t expected : 20 (esc)
+    device 18:\t\t stored : 15\t expected : 20 (esc)
+    device 19:\t\t stored : 20\t expected : 20 (esc)
+    device 20:\t\t stored : 26\t expected : 20 (esc)
+    device 21:\t\t stored : 17\t expected : 20 (esc)
+    device 22:\t\t stored : 16\t expected : 20 (esc)
+    device 23:\t\t stored : 16\t expected : 20 (esc)
+    device 24:\t\t stored : 16\t expected : 20 (esc)
+  rule 0 (replicated_ruleset) num_rep 7 result size == 3:\t2/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 7 result size == 4:\t42/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 7 result size == 5:\t56/100 (esc)
+    device 0:\t\t stored : 1\t expected : 20 (esc)
+    device 1:\t\t stored : 1\t expected : 20 (esc)
+    device 2:\t\t stored : 95\t expected : 20 (esc)
+    device 3:\t\t stored : 2\t expected : 20 (esc)
+    device 4:\t\t stored : 1\t expected : 20 (esc)
+    device 5:\t\t stored : 14\t expected : 20 (esc)
+    device 6:\t\t stored : 14\t expected : 20 (esc)
+    device 7:\t\t stored : 16\t expected : 20 (esc)
+    device 8:\t\t stored : 19\t expected : 20 (esc)
+    device 9:\t\t stored : 22\t expected : 20 (esc)
+    device 10:\t\t stored : 15\t expected : 20 (esc)
+    device 11:\t\t stored : 16\t expected : 20 (esc)
+    device 12:\t\t stored : 17\t expected : 20 (esc)
+    device 13:\t\t stored : 19\t expected : 20 (esc)
+    device 14:\t\t stored : 20\t expected : 20 (esc)
+    device 15:\t\t stored : 19\t expected : 20 (esc)
+    device 16:\t\t stored : 20\t expected : 20 (esc)
+    device 17:\t\t stored : 17\t expected : 20 (esc)
+    device 18:\t\t stored : 15\t expected : 20 (esc)
+    device 19:\t\t stored : 20\t expected : 20 (esc)
+    device 20:\t\t stored : 26\t expected : 20 (esc)
+    device 21:\t\t stored : 17\t expected : 20 (esc)
+    device 22:\t\t stored : 16\t expected : 20 (esc)
+    device 23:\t\t stored : 16\t expected : 20 (esc)
+    device 24:\t\t stored : 16\t expected : 20 (esc)
+  rule 0 (replicated_ruleset) num_rep 8 result size == 3:\t2/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 8 result size == 4:\t40/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 8 result size == 5:\t58/100 (esc)
+    device 0:\t\t stored : 1\t expected : 20 (esc)
+    device 1:\t\t stored : 1\t expected : 20 (esc)
+    device 2:\t\t stored : 95\t expected : 20 (esc)
+    device 3:\t\t stored : 2\t expected : 20 (esc)
+    device 4:\t\t stored : 1\t expected : 20 (esc)
+    device 5:\t\t stored : 14\t expected : 20 (esc)
+    device 6:\t\t stored : 14\t expected : 20 (esc)
+    device 7:\t\t stored : 16\t expected : 20 (esc)
+    device 8:\t\t stored : 19\t expected : 20 (esc)
+    device 9:\t\t stored : 22\t expected : 20 (esc)
+    device 10:\t\t stored : 15\t expected : 20 (esc)
+    device 11:\t\t stored : 16\t expected : 20 (esc)
+    device 12:\t\t stored : 17\t expected : 20 (esc)
+    device 13:\t\t stored : 20\t expected : 20 (esc)
+    device 14:\t\t stored : 20\t expected : 20 (esc)
+    device 15:\t\t stored : 19\t expected : 20 (esc)
+    device 16:\t\t stored : 20\t expected : 20 (esc)
+    device 17:\t\t stored : 17\t expected : 20 (esc)
+    device 18:\t\t stored : 16\t expected : 20 (esc)
+    device 19:\t\t stored : 20\t expected : 20 (esc)
+    device 20:\t\t stored : 26\t expected : 20 (esc)
+    device 21:\t\t stored : 17\t expected : 20 (esc)
+    device 22:\t\t stored : 16\t expected : 20 (esc)
+    device 23:\t\t stored : 16\t expected : 20 (esc)
+    device 24:\t\t stored : 16\t expected : 20 (esc)
+  rule 0 (replicated_ruleset) num_rep 9 result size == 3:\t2/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 9 result size == 4:\t37/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 9 result size == 5:\t61/100 (esc)
+    device 0:\t\t stored : 1\t expected : 20 (esc)
+    device 1:\t\t stored : 1\t expected : 20 (esc)
+    device 2:\t\t stored : 95\t expected : 20 (esc)
+    device 3:\t\t stored : 2\t expected : 20 (esc)
+    device 4:\t\t stored : 1\t expected : 20 (esc)
+    device 5:\t\t stored : 14\t expected : 20 (esc)
+    device 6:\t\t stored : 14\t expected : 20 (esc)
+    device 7:\t\t stored : 16\t expected : 20 (esc)
+    device 8:\t\t stored : 19\t expected : 20 (esc)
+    device 9:\t\t stored : 23\t expected : 20 (esc)
+    device 10:\t\t stored : 15\t expected : 20 (esc)
+    device 11:\t\t stored : 16\t expected : 20 (esc)
+    device 12:\t\t stored : 17\t expected : 20 (esc)
+    device 13:\t\t stored : 20\t expected : 20 (esc)
+    device 14:\t\t stored : 21\t expected : 20 (esc)
+    device 15:\t\t stored : 19\t expected : 20 (esc)
+    device 16:\t\t stored : 20\t expected : 20 (esc)
+    device 17:\t\t stored : 18\t expected : 20 (esc)
+    device 18:\t\t stored : 16\t expected : 20 (esc)
+    device 19:\t\t stored : 20\t expected : 20 (esc)
+    device 20:\t\t stored : 26\t expected : 20 (esc)
+    device 21:\t\t stored : 17\t expected : 20 (esc)
+    device 22:\t\t stored : 16\t expected : 20 (esc)
+    device 23:\t\t stored : 16\t expected : 20 (esc)
+    device 24:\t\t stored : 16\t expected : 20 (esc)
+  rule 0 (replicated_ruleset) num_rep 10 result size == 3:\t2/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 10 result size == 4:\t36/100 (esc)
+  rule 0 (replicated_ruleset) num_rep 10 result size == 5:\t62/100 (esc)
+    device 0:\t\t stored : 1\t expected : 20 (esc)
+    device 1:\t\t stored : 1\t expected : 20 (esc)
+    device 2:\t\t stored : 95\t expected : 20 (esc)
+    device 3:\t\t stored : 2\t expected : 20 (esc)
+    device 4:\t\t stored : 1\t expected : 20 (esc)
+    device 5:\t\t stored : 14\t expected : 20 (esc)
+    device 6:\t\t stored : 14\t expected : 20 (esc)
+    device 7:\t\t stored : 16\t expected : 20 (esc)
+    device 8:\t\t stored : 19\t expected : 20 (esc)
+    device 9:\t\t stored : 23\t expected : 20 (esc)
+    device 10:\t\t stored : 15\t expected : 20 (esc)
+    device 11:\t\t stored : 17\t expected : 20 (esc)
+    device 12:\t\t stored : 17\t expected : 20 (esc)
+    device 13:\t\t stored : 20\t expected : 20 (esc)
+    device 14:\t\t stored : 21\t expected : 20 (esc)
+    device 15:\t\t stored : 19\t expected : 20 (esc)
+    device 16:\t\t stored : 20\t expected : 20 (esc)
+    device 17:\t\t stored : 18\t expected : 20 (esc)
+    device 18:\t\t stored : 16\t expected : 20 (esc)
+    device 19:\t\t stored : 20\t expected : 20 (esc)
+    device 20:\t\t stored : 26\t expected : 20 (esc)
+    device 21:\t\t stored : 17\t expected : 20 (esc)
+    device 22:\t\t stored : 16\t expected : 20 (esc)
+    device 23:\t\t stored : 16\t expected : 20 (esc)
+    device 24:\t\t stored : 16\t expected : 20 (esc)
+  crushtool successfully built or modified map.  Use '-o <file>' to write it out.