]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
erasure-code: ensure m >= 1
authorSage Weil <sage@redhat.com>
Tue, 12 Mar 2019 13:57:21 +0000 (08:57 -0500)
committerSage Weil <sage@redhat.com>
Tue, 12 Mar 2019 18:12:58 +0000 (13:12 -0500)
Fixes: http://tracker.ceph.com/issues/38682
Signed-off-by: Sage Weil <sage@redhat.com>
qa/workunits/cephtool/test.sh
src/erasure-code/ErasureCode.cc
src/erasure-code/ErasureCode.h
src/erasure-code/clay/ErasureCodeClay.cc
src/erasure-code/isa/ErasureCodeIsa.cc
src/erasure-code/jerasure/ErasureCodeJerasure.cc
src/test/erasure-code/TestErasureCodeLrc.cc

index bf6170825026476174f177bdc25f5a9662a5592d..827d081090b7f6936114017a02240b7c42ffab14 100755 (executable)
@@ -2231,6 +2231,16 @@ function test_mon_osd_erasure_code()
   # clean up
   ceph osd erasure-code-profile rm fooprofile
   ceph osd erasure-code-profile rm barprofile
+
+  # try weird k and m values
+  expect_false ceph osd erasure-code-profile set badk k=1 m=1
+  expect_false ceph osd erasure-code-profile set badk k=1 m=2
+  expect_false ceph osd erasure-code-profile set badk k=0 m=2
+  expect_false ceph osd erasure-code-profile set badk k=-1 m=2
+  expect_false ceph osd erasure-code-profile set badm k=2 m=0
+  expect_false ceph osd erasure-code-profile set badm k=2 m=-1
+  ceph osd erasure-code-profile set good k=2 m=1
+  ceph osd erasure-code-profile rm good
 }
 
 function test_mon_osd_misc()
index 00fccf8fc9f975d7b95201eb69aa8fe5c837a56f..3fdf54913640589a63e76fd7ad0952229b5e0662 100644 (file)
@@ -71,14 +71,17 @@ int ErasureCode::create_rule(
   return ruleid;
 }
 
-int ErasureCode::sanity_check_k(int k, ostream *ss)
+int ErasureCode::sanity_check_k_m(int k, int m, ostream *ss)
 {
   if (k < 2) {
     *ss << "k=" << k << " must be >= 2" << std::endl;
     return -EINVAL;
-  } else {
-    return 0;
   }
+  if (m < 1) {
+    *ss << "m=" << m << " must be >= 1" << std::endl;
+    return -EINVAL;
+  }
+  return 0;
 }
 
 int ErasureCode::chunk_index(unsigned int i) const
index d3c5badb1f1626678255f5e09892531838c37b33..85ebf66f04e1f9386ff3837b50b5d361a3055c5b 100644 (file)
@@ -50,7 +50,7 @@ namespace ceph {
                    CrushWrapper &crush,
                    std::ostream *ss) const override;
 
-    int sanity_check_k(int k, std::ostream *ss);
+    int sanity_check_k_m(int k, int m, std::ostream *ss);
 
     unsigned int get_coding_chunk_count() const override {
       return get_chunk_count() - get_data_chunk_count();
index 2bf45b72f9de72911b9ceba9f88f7b582bc12403..7ff28c1d5541b8f9731366cbddc151a42473dc7f 100644 (file)
@@ -193,7 +193,7 @@ int ErasureCodeClay::parse(ErasureCodeProfile &profile,
   err |= to_int("k", profile, &k, DEFAULT_K, ss);
   err |= to_int("m", profile, &m, DEFAULT_M, ss);
 
-  err |= sanity_check_k(k, ss);
+  err |= sanity_check_k_m(k, m, ss);
 
   err |= to_int("d", profile, &d, std::to_string(k+m-1), ss);
 
index fec86a9ac2ceb87b6b32be31f2e1bdcc67e4c69e..6f2f181f5f81d44d3f65587ed394a7095495055b 100644 (file)
@@ -325,7 +325,7 @@ int ErasureCodeIsaDefault::parse(ErasureCodeProfile &profile,
   int err = ErasureCode::parse(profile, ss);
   err |= to_int("k", profile, &k, DEFAULT_K, ss);
   err |= to_int("m", profile, &m, DEFAULT_M, ss);
-  err |= sanity_check_k(k, ss);
+  err |= sanity_check_k_m(k, m, ss);
 
   if (matrixtype == kVandermonde) {
     // these are verified safe values evaluated using the
index 90d0dc8797b6fbdb534a4d982b5265c0fa4f1bbb..fee779047f9107f39db20722c40d7dcb4c195399 100644 (file)
@@ -66,7 +66,7 @@ int ErasureCodeJerasure::parse(ErasureCodeProfile &profile,
     chunk_mapping.clear();
     err = -EINVAL;
   }
-  err |= sanity_check_k(k, ss);
+  err |= sanity_check_k_m(k, m, ss);
   return err;
 }
 
index 9df75dabc91a5d2bde86f7761cc6d9e687fa824c..79385f33944ec0e92b6b41f33d3968ad2dc49221 100644 (file)
@@ -392,7 +392,7 @@ TEST(ErasureCodeLrc, layers_sanity_checks)
       "  [ \"DD\", \"\" ], "
       "]";
     profile["layers"] = description_string;
-    EXPECT_EQ(ERROR_LRC_MAPPING_SIZE, lrc.init(profile, &cerr));
+    EXPECT_EQ(-EINVAL, lrc.init(profile, &cerr));
   }
 }