]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crushtool: require min/max or num-rep for --test
authorSage Weil <sage@newdream.net>
Sun, 27 Jun 2021 15:38:08 +0000 (11:38 -0400)
committerSage Weil <sage@newdream.net>
Mon, 28 Jun 2021 22:34:31 +0000 (18:34 -0400)
Adjust CLI test cases accordingly.

Note that the reclassify outputs changed slightly because the original
maps have min/max_size that vary between rules, so we can't get the exact
same output.

Signed-off-by: Sage Weil <sage@newdream.net>
16 files changed:
src/crush/CrushTester.cc
src/test/cli/crushtool/arg-order-checks.t
src/test/cli/crushtool/reclassify.t
src/test/cli/crushtool/set-choose.t
src/test/cli/crushtool/test-map-bobtail-tunables.t
src/test/cli/crushtool/test-map-firefly-tunables.t
src/test/cli/crushtool/test-map-firstn-indep.t
src/test/cli/crushtool/test-map-hammer-tunables.t
src/test/cli/crushtool/test-map-indep.t
src/test/cli/crushtool/test-map-jewel-tunables.t
src/test/cli/crushtool/test-map-legacy-tunables.t
src/test/cli/crushtool/test-map-vary-r-0.t
src/test/cli/crushtool/test-map-vary-r-1.t
src/test/cli/crushtool/test-map-vary-r-2.t
src/test/cli/crushtool/test-map-vary-r-3.t
src/test/cli/crushtool/test-map-vary-r-4.t

index 22cdf0db2707c9a68c117a16aeaf69b24d83650e..372e0b9d4603901df016a489c154c4133a60f568 100644 (file)
@@ -439,6 +439,10 @@ int CrushTester::test()
     min_x = 0;
     max_x = 1023;
   }
+  if (min_rep < 0 && max_rep < 0) {
+    cerr << "must specify --num-rep or both --min-rep and --max-rep" << std::endl;
+    return -EINVAL;
+  }
 
   // initial osd weights
   vector<__u32> weight;
@@ -478,19 +482,14 @@ int CrushTester::test()
         err << "rule " << r << " dne" << std::endl;
       continue;
     }
-    int minr = min_rep, maxr = max_rep;
-    if (min_rep < 0 || max_rep < 0) {
-      minr = crush.get_rule_mask_min_size(r);
-      maxr = crush.get_rule_mask_max_size(r);
-    }
     
     if (output_statistics)
       err << "rule " << r << " (" << crush.get_rule_name(r)
       << "), x = " << min_x << ".." << max_x
-      << ", numrep = " << minr << ".." << maxr
+      << ", numrep = " << min_rep << ".." << max_rep
       << std::endl;
 
-    for (int nr = minr; nr <= maxr; nr++) {
+    for (int nr = min_rep; nr <= max_rep; nr++) {
       vector<int> per(crush.get_max_devices());
       map<int,int> sizes;
 
@@ -720,13 +719,8 @@ int CrushTester::compare(CrushWrapper& crush2)
         err << "rule " << r << " dne" << std::endl;
       continue;
     }
-    int minr = min_rep, maxr = max_rep;
-    if (min_rep < 0 || max_rep < 0) {
-      minr = crush.get_rule_mask_min_size(r);
-      maxr = crush.get_rule_mask_max_size(r);
-    }
     int bad = 0;
-    for (int nr = minr; nr <= maxr; nr++) {
+    for (int nr = min_rep; nr <= max_rep; nr++) {
       for (int x = min_x; x <= max_x; ++x) {
        vector<int> out;
        crush.do_rule(r, x, out, nr, weight, 0);
@@ -740,7 +734,7 @@ int CrushTester::compare(CrushWrapper& crush2)
     if (bad) {
       ret = -1;
     }
-    int max = (maxr - minr + 1) * (max_x - min_x + 1);
+    int max = (max_rep - min_rep + 1) * (max_x - min_x + 1);
     double ratio = (double)bad / (double)max;
     cout << "rule " << r << " had " << bad << "/" << max
         << " mismatched mappings (" << ratio << ")" << std::endl;
index d01d43aa0de40c363fae2708e0c34210abe8d3dc..85c8748d50569a05675c497561297fd27d56ff2e 100644 (file)
   
   # end crush map
 # tunables before reweight
-  $ crushtool -i "$map" --set-straw-calc-version 0 --reweight --test --show-utilization --max-x 100 --min-x 1
+  $ crushtool -i "$map" --set-straw-calc-version 0 --reweight --test --show-utilization --max-x 100 --min-x 1 --min-rep 1 --max-rep 10
   rule 0 (replicated_rule), x = 1..100, numrep = 1..10
   rule 0 (replicated_rule) num_rep 1 result size == 1:\t100/100 (esc)
     device 0:\t\t stored : 4\t expected : 4 (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
+  $ crushtool -i "$map" --set-straw-calc-version 1 --reweight --test --show-utilization --max-x 100 --min-x 1 --min-rep 1 --max-rep 10
   rule 0 (replicated_rule), x = 1..100, numrep = 1..10
   rule 0 (replicated_rule) num_rep 1 result size == 1:\t100/100 (esc)
     device 1:\t\t stored : 1\t expected : 4 (esc)
index 3ae1529a67a78530e860465f2c27000a04f817b7..ea04ff10e98ba5633b359040aa4cfbf9918dc35d 100644 (file)
@@ -18,7 +18,7 @@
   moving items from -23 (ttipod001-cephosd-1-ssd) to -7 (ttipod001-cephosd-1)
   moving items from -22 (ttipod001-cephosd-2-ssd) to -8 (ttipod001-cephosd-2)
   moving items from -21 (ssd) to -5 (default)
-  $ crushtool -i $TESTDIR/crush-classes/a --compare foo
+  $ crushtool -i $TESTDIR/crush-classes/a --compare foo --min-rep 1 --max-rep 10
   rule 0 had 0/10240 mismatched mappings (0)
   rule 1 had 0/10240 mismatched mappings (0)
   maps appear equivalent
@@ -51,7 +51,7 @@
   moving items from -9 (node-21-ssd) to -25 (node-21)
   moving items from -8 (node-20-ssd) to -18 (node-20)
   moving items from -7 (ssd) to -13 (default)
-  $ crushtool -i $TESTDIR/crush-classes/d --compare foo
+  $ crushtool -i $TESTDIR/crush-classes/d --compare foo --min-rep 1 --max-rep 10
   rule 0 had 0/10240 mismatched mappings (0)
   rule 1 had 0/10240 mismatched mappings (0)
   maps appear equivalent
@@ -99,7 +99,7 @@
 
 this one has weird node weights, so *lots* of mappings change...
 
-  $ crushtool -i $TESTDIR/crush-classes/e --compare foo
+  $ crushtool -i $TESTDIR/crush-classes/e --compare foo --min-rep 1 --max-rep 10
   rule 0 had 6540/10240 mismatched mappings (0.638672)
   rule 1 had 8417/10240 mismatched mappings (0.821973)
   warning: maps are NOT equivalent
@@ -149,9 +149,9 @@ this one has weird node weights, so *lots* of mappings change...
 wonky crush weights on Ceph-Stor1, so a small number of mappings change
 because the new map has a strictly summing hierarchy.
 
-  $ crushtool -i $TESTDIR/crush-classes/c --compare foo
+  $ crushtool -i $TESTDIR/crush-classes/c --compare foo --min-rep 1 --max-rep 10
   rule 0 had 158/10240 mismatched mappings (0.0154297)
-  rule 1 had 62/5120 mismatched mappings (0.0121094)
+  rule 1 had 138/10240 mismatched mappings (0.0134766)
   rule 2 had 0/10240 mismatched mappings (0)
   warning: maps are NOT equivalent
   [1]
@@ -222,7 +222,7 @@ because the new map has a strictly summing hierarchy.
     renumbering bucket -83 -> -55
     renumbering bucket -73 -> -56
     renumbering bucket -69 -> -57
-  $ crushtool -i $TESTDIR/crush-classes/beesly --compare foo
+  $ crushtool -i $TESTDIR/crush-classes/beesly --compare foo --min-rep 1 --max-rep 10
   rule 0 had 0/10240 mismatched mappings (0)
   rule 1 had 0/10240 mismatched mappings (0)
   rule 2 had 0/10240 mismatched mappings (0)
@@ -238,7 +238,7 @@ because the new map has a strictly summing hierarchy.
     renumbering bucket -4 -> -11
     renumbering bucket -3 -> -13
     renumbering bucket -2 -> -14
-  $ crushtool -i $TESTDIR/crush-classes/flax --compare foo
+  $ crushtool -i $TESTDIR/crush-classes/flax --compare foo --min-rep 1 --max-rep 10
   rule 0 had 0/10240 mismatched mappings (0)
   maps appear equivalent
 
@@ -279,9 +279,9 @@ below is an adjusted version of the same cluster's map
     renumbering bucket -14 -> -200
     renumbering bucket -5 -> -201
     renumbering bucket -2 -> -202
-  $ crushtool -i $TESTDIR/crush-classes/gabe2 --compare foo
+  $ crushtool -i $TESTDIR/crush-classes/gabe2 --compare foo --min-rep 1 --max-rep 10
   rule 0 had 627/10240 mismatched mappings (0.0612305)
-  rule 1 had 422/6144 mismatched mappings (0.0686849)
+  rule 1 had 652/10240 mismatched mappings (0.0636719)
   warning: maps are NOT equivalent
   [1]
 
@@ -404,9 +404,9 @@ below is an adjusted version of the same cluster's map
   new bucket -155 missing parent, adding at {root=default}
   new bucket -154 missing parent, adding at {root=default}
 
-  $ crushtool -i $TESTDIR/crush-classes/b --compare foo
-  rule 0 had 0/3072 mismatched mappings (0)
-  rule 1 had 0/4096 mismatched mappings (0)
+  $ crushtool -i $TESTDIR/crush-classes/b --compare foo --min-rep 1 --max-rep 10
+  rule 0 had 0/10240 mismatched mappings (0)
+  rule 1 had 0/10240 mismatched mappings (0)
   maps appear equivalent
 
   $ crushtool -i $TESTDIR/crush-classes/f --reclassify --reclassify-root default hdd -o foo
@@ -440,9 +440,9 @@ below is an adjusted version of the same cluster's map
 We expect some mismatches below because there are some ssd-labeled nodes under
 default that we aren't changing the class on.
 
-  $ crushtool -i $TESTDIR/crush-classes/f --compare foo
+  $ crushtool -i $TESTDIR/crush-classes/f --compare foo --min-rep 1 --max-rep 10
   rule 0 had 627/10240 mismatched mappings (0.0612305)
-  rule 1 had 422/6144 mismatched mappings (0.0686849)
+  rule 1 had 652/10240 mismatched mappings (0.0636719)
   warning: maps are NOT equivalent
   [1]
 
@@ -556,7 +556,7 @@ default that we aren't changing the class on.
   moving items from -4 (sata-osd14) to -87 (osd14)
   moving items from -3 (sata-osd10) to -86 (osd10)
   moving items from -2 (sata-osd11) to -85 (osd11)
-  $ crushtool -i $TESTDIR/crush-classes/g --compare foo
+  $ crushtool -i $TESTDIR/crush-classes/g --compare foo --min-rep 1 --max-rep 10
   rule 0 had 0/10240 mismatched mappings (0)
   rule 1 had 0/10240 mismatched mappings (0)
   maps appear equivalent
index 42df9f21e260cb9cb77dde5948a93c25281ddc9c..bd0e800406e3d8109baeb6f566bb5ae1b3d62d7e 100644 (file)
@@ -1,5 +1,5 @@
   $ crushtool -c "$TESTDIR/set-choose.crushmap.txt" -o set-choose.crushmap
-  $ crushtool -i set-choose.crushmap --test --show-mappings --show-statistics --set-straw-calc-version 0
+  $ crushtool -i set-choose.crushmap --test --show-mappings --show-statistics --set-straw-calc-version 0 --min-rep 2 --max-rep 3
   rule 0 (choose), x = 0..1023, numrep = 2..3
   CRUSH rule 0 x 0 [0,3]
   CRUSH rule 0 x 1 [0,8]
   CRUSH rule 5 x 1023 [3,2,8]
   rule 5 (chooseleaf-set) num_rep 3 result size == 3:\t1024/1024 (esc)
   crushtool successfully built or modified map.  Use '-o <file>' to write it out.
-  $ crushtool -i set-choose.crushmap --test --show-mappings --show-statistics --weight 0 0 --weight 1 0 --weight 3 0 --weight 4 0 --set-straw-calc-version 0
+  $ crushtool -i set-choose.crushmap --test --show-mappings --show-statistics --weight 0 0 --weight 1 0 --weight 3 0 --weight 4 0 --set-straw-calc-version 0 --min-rep 2 --max-rep 3
   rule 0 (choose), x = 0..1023, numrep = 2..3
   CRUSH rule 0 x 0 [2,5]
   CRUSH rule 0 x 1 [2,8]
   CRUSH rule 5 x 1023 [5,2,8]
   rule 5 (chooseleaf-set) num_rep 3 result size == 3:\t1024/1024 (esc)
   crushtool successfully built or modified map.  Use '-o <file>' to write it out.
-  $ crushtool -i set-choose.crushmap --test --show-mappings --show-statistics --weight 0 0 --weight 3 0 --weight 4 .5 --weight 5 0 --weight 6 .1 --weight 7 0 --set-straw-calc-version 0
+  $ crushtool -i set-choose.crushmap --test --show-mappings --show-statistics --weight 0 0 --weight 3 0 --weight 4 .5 --weight 5 0 --weight 6 .1 --weight 7 0 --set-straw-calc-version 0 --min-rep 2 --max-rep 3
   rule 0 (choose), x = 0..1023, numrep = 2..3
   CRUSH rule 0 x 0 [2,4]
   CRUSH rule 0 x 1 [2,8]
index 5037cfd8e87190b70165ebfa7f593b3df967583a..3bec87a746d6c1f1c1c84bd063dea144f0973181 100644 (file)
@@ -1,4 +1,4 @@
-  $ crushtool -i "$TESTDIR/test-map-a.crushmap" --test --show-mappings --show-statistics --rule 0 --set-choose-local-tries 0 --set-choose-local-fallback-tries 0 --set-choose-total-tries 50 --set-chooseleaf-descend-once 1
+  $ crushtool -i "$TESTDIR/test-map-a.crushmap" --test --show-mappings --show-statistics --rule 0 --set-choose-local-tries 0 --set-choose-local-fallback-tries 0 --set-choose-total-tries 50 --set-chooseleaf-descend-once 1 --min-rep 1 --max-rep 10
   rule 0 (data), x = 0..1023, numrep = 1..10
   CRUSH rule 0 x 0 [36]
   CRUSH rule 0 x 1 [876]
index 93bba48d787e2d9f269d165f138b6d64e8bf77fb..a17b157033f3404150ed377855940c6acf768ab3 100644 (file)
@@ -1,4 +1,4 @@
-  $ crushtool -i "$TESTDIR/test-map-vary-r.crushmap" --test --show-mappings --show-statistics --rule 0 --set-choose-local-tries 0 --set-choose-local-fallback-tries 0 --set-choose-total-tries 50 --set-chooseleaf-descend-once 1 --set-chooseleaf-vary-r 1 --weight 12 0 --weight 20 0 --weight 30 0
+  $ crushtool -i "$TESTDIR/test-map-vary-r.crushmap" --test --show-mappings --show-statistics --rule 0 --set-choose-local-tries 0 --set-choose-local-fallback-tries 0 --set-choose-total-tries 50 --set-chooseleaf-descend-once 1 --set-chooseleaf-vary-r 1 --weight 12 0 --weight 20 0 --weight 30 0 --min-rep 1 --max-rep 10
   rule 0 (data), x = 0..1023, numrep = 1..10
   CRUSH rule 0 x 0 [101]
   CRUSH rule 0 x 1 [80]
index 1b8c736ea6823d0a6fd709345adbd8b229555563..4b67285d11d6b2428d70f43dd537feb25c9dfd35 100644 (file)
@@ -1,8 +1,8 @@
   $ crushtool -c "$TESTDIR/test-map-firstn-indep.txt" -o "$TESTDIR/test-map-firstn-indep.crushmap"
-  $ crushtool -i "$TESTDIR/test-map-firstn-indep.crushmap" --test --rule 0 --x 1 --show-bad-mappings
+  $ crushtool -i "$TESTDIR/test-map-firstn-indep.crushmap" --test --rule 0 --x 1 --show-bad-mappings --min-rep 1 --max-rep 10
   bad mapping rule 0 x 1 num_rep 9 result [93,80,88,87,56,50,53,72]
   bad mapping rule 0 x 1 num_rep 10 result [93,80,88,87,56,50,53,72]
-  $ crushtool -i "$TESTDIR/test-map-firstn-indep.crushmap" --test --rule 1 --x 1 --show-bad-mappings
+  $ crushtool -i "$TESTDIR/test-map-firstn-indep.crushmap" --test --rule 1 --x 1 --show-bad-mappings --min-rep 1 --max-rep 10
   bad mapping rule 1 x 1 num_rep 3 result [93,56]
   bad mapping rule 1 x 1 num_rep 4 result [93,56]
   bad mapping rule 1 x 1 num_rep 5 result [93,56]
index 75c15e26e7829c9547bec977dde5e55705ffe52f..a5b720fe99ae430ccdcf634913a52d6ee1ea105b 100644 (file)
@@ -1,4 +1,4 @@
-  $ crushtool -i "$TESTDIR/test-map-hammer-tunables.crushmap" --test --show-mappings --show-statistics --rule 0 --weight 12 0 --weight 20 0 --weight 30 0
+  $ crushtool -i "$TESTDIR/test-map-hammer-tunables.crushmap" --test --show-mappings --show-statistics --rule 0 --weight 12 0 --weight 20 0 --weight 30 0 --min-rep 1 --max-rep 10
   rule 0 (data), x = 0..1023, numrep = 1..10
   CRUSH rule 0 x 0 [101]
   CRUSH rule 0 x 1 [80]
index 37eb7b51d116a6af0b2b583676cc436bba5ee686..8863321754d498e3b9226db21da05cfac3f264d8 100644 (file)
@@ -1,4 +1,4 @@
-  $ crushtool -i "$TESTDIR/test-map-indep.crushmap" --test --show-mappings --show-statistics --rule 1 --set-choose-local-tries 0 --set-choose-local-fallback-tries 0 --set-choose-total-tries 50 --set-chooseleaf-descend-once 2
+  $ crushtool -i "$TESTDIR/test-map-indep.crushmap" --test --show-mappings --show-statistics --rule 1 --set-choose-local-tries 0 --set-choose-local-fallback-tries 0 --set-choose-total-tries 50 --set-chooseleaf-descend-once 2 --min-rep 1 --max-rep 10
   rule 1 (metadata), x = 0..1023, numrep = 1..10
   CRUSH rule 1 x 0 [36]
   CRUSH rule 1 x 1 [876]
index f0c632b3b3fee42c0e080f298919364cef8361ee..47acb51a4faa3a6b019de83eeff6f4e3f36780af 100644 (file)
@@ -1,4 +1,4 @@
-  $ crushtool -i "$TESTDIR/test-map-jewel-tunables.crushmap" --test --show-mappings --show-statistics --rule 0 --weight 12 0 --weight 20 0 --weight 30 0
+  $ crushtool -i "$TESTDIR/test-map-jewel-tunables.crushmap" --test --show-mappings --show-statistics --rule 0 --weight 12 0 --weight 20 0 --weight 30 0 --min-rep 1 --max-rep 10
   rule 0 (data), x = 0..1023, numrep = 1..10
   CRUSH rule 0 x 0 [101]
   CRUSH rule 0 x 1 [80]
index fe28c70ea5ce36b228d2736665296cb085b3ffe9..bdfa004acb7409484d67d8008ee8a8bf6e425519 100644 (file)
@@ -1,4 +1,4 @@
-  $ crushtool -i "$TESTDIR/test-map-a.crushmap" --test --show-mappings --show-statistics --rule 0
+  $ crushtool -i "$TESTDIR/test-map-a.crushmap" --test --show-mappings --show-statistics --rule 0 --min-rep 1 --max-rep 10
   rule 0 (data), x = 0..1023, numrep = 1..10
   CRUSH rule 0 x 0 [36]
   CRUSH rule 0 x 1 [876]
index 389e3cf9e766c27bf41f227bd6c549702d3567b9..0a294aa96932b90a6dd735a2ae4535bc85e2a309 100644 (file)
@@ -1,4 +1,4 @@
-  $ crushtool -i "$TESTDIR/test-map-vary-r.crushmap" --test --show-mappings --show-statistics --rule 3 --set-chooseleaf-vary-r 0 --weight 0 0 --weight 4 0 --weight 9 0
+  $ crushtool -i "$TESTDIR/test-map-vary-r.crushmap" --test --show-mappings --show-statistics --rule 3 --set-chooseleaf-vary-r 0 --weight 0 0 --weight 4 0 --weight 9 0 --min-rep 2 --max-rep 4
   rule 3 (delltestrule), x = 0..1023, numrep = 2..4
   CRUSH rule 3 x 0 [94,85]
   CRUSH rule 3 x 1 [73,78]
index f58886056b68ab64b85de40c7ab5bb3b338b4f04..3b871c1290f8460b889ac5f847dc899dbc153f17 100644 (file)
@@ -1,4 +1,4 @@
-  $ crushtool -i "$TESTDIR/test-map-vary-r.crushmap" --test --show-mappings --show-statistics --rule 3 --set-chooseleaf-vary-r 1 --weight 0 0 --weight 4 0 --weight 9 0
+  $ crushtool -i "$TESTDIR/test-map-vary-r.crushmap" --test --show-mappings --show-statistics --rule 3 --set-chooseleaf-vary-r 1 --weight 0 0 --weight 4 0 --weight 9 0 --min-rep 2 --max-rep 4
   rule 3 (delltestrule), x = 0..1023, numrep = 2..4
   CRUSH rule 3 x 0 [94,6]
   CRUSH rule 3 x 1 [73,52]
index efc1932ec4a35f090d3d46c7d8d94bbb5126ac19..c9d936590f5fcc2f679b01e243214c8c9a2e0f5e 100644 (file)
@@ -1,4 +1,4 @@
-  $ crushtool -i "$TESTDIR/test-map-vary-r.crushmap" --test --show-mappings --show-statistics --rule 3 --set-chooseleaf-vary-r 2 --weight 0 0 --weight 4 0 --weight 9 0
+  $ crushtool -i "$TESTDIR/test-map-vary-r.crushmap" --test --show-mappings --show-statistics --rule 3 --set-chooseleaf-vary-r 2 --weight 0 0 --weight 4 0 --weight 9 0 --min-rep 2 --max-rep 4
   rule 3 (delltestrule), x = 0..1023, numrep = 2..4
   CRUSH rule 3 x 0 [94,45]
   CRUSH rule 3 x 1 [73,78]
index ec41ecbf37062e45f3197fb4c332534404b44401..554e0bc656a8f0071fc1dde5e653cd100af72e11 100644 (file)
@@ -1,4 +1,4 @@
-  $ crushtool -i "$TESTDIR/test-map-vary-r.crushmap" --test --show-mappings --show-statistics --rule 3 --set-chooseleaf-vary-r 3 --weight 0 0 --weight 4 0 --weight 9 0
+  $ crushtool -i "$TESTDIR/test-map-vary-r.crushmap" --test --show-mappings --show-statistics --rule 3 --set-chooseleaf-vary-r 3 --weight 0 0 --weight 4 0 --weight 9 0 --min-rep 2 --max-rep 4
   rule 3 (delltestrule), x = 0..1023, numrep = 2..4
   CRUSH rule 3 x 0 [94,85]
   CRUSH rule 3 x 1 [73,78]
index e32a19446807ab9d6d04ec23fe5ace44f65899f6..29b41ccf69b51a3c1f7b1d8fbef66c14525b4f25 100644 (file)
@@ -1,4 +1,4 @@
-  $ crushtool -i "$TESTDIR/test-map-vary-r.crushmap" --test --show-mappings --show-statistics --rule 3 --set-chooseleaf-vary-r 4 --weight 0 0 --weight 4 0 --weight 9 0
+  $ crushtool -i "$TESTDIR/test-map-vary-r.crushmap" --test --show-mappings --show-statistics --rule 3 --set-chooseleaf-vary-r 4 --weight 0 0 --weight 4 0 --weight 9 0 --min-rep 2 --max-rep 4
   rule 3 (delltestrule), x = 0..1023, numrep = 2..4
   CRUSH rule 3 x 0 [94,85]
   CRUSH rule 3 x 1 [73,78]