From ab0a6528266ab30d442f351de97f5475399ff278 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 12 Mar 2019 08:57:21 -0500 Subject: [PATCH] erasure-code: ensure m >= 1 Fixes: http://tracker.ceph.com/issues/38682 Signed-off-by: Sage Weil --- qa/workunits/cephtool/test.sh | 10 ++++++++++ src/erasure-code/ErasureCode.cc | 9 ++++++--- src/erasure-code/ErasureCode.h | 2 +- src/erasure-code/clay/ErasureCodeClay.cc | 2 +- src/erasure-code/isa/ErasureCodeIsa.cc | 2 +- src/erasure-code/jerasure/ErasureCodeJerasure.cc | 2 +- src/test/erasure-code/TestErasureCodeLrc.cc | 2 +- 7 files changed, 21 insertions(+), 8 deletions(-) diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index bf61708250264..827d081090b7f 100755 --- a/qa/workunits/cephtool/test.sh +++ b/qa/workunits/cephtool/test.sh @@ -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() diff --git a/src/erasure-code/ErasureCode.cc b/src/erasure-code/ErasureCode.cc index 00fccf8fc9f97..3fdf549136405 100644 --- a/src/erasure-code/ErasureCode.cc +++ b/src/erasure-code/ErasureCode.cc @@ -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 diff --git a/src/erasure-code/ErasureCode.h b/src/erasure-code/ErasureCode.h index d3c5badb1f162..85ebf66f04e1f 100644 --- a/src/erasure-code/ErasureCode.h +++ b/src/erasure-code/ErasureCode.h @@ -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(); diff --git a/src/erasure-code/clay/ErasureCodeClay.cc b/src/erasure-code/clay/ErasureCodeClay.cc index 2bf45b72f9de7..7ff28c1d5541b 100644 --- a/src/erasure-code/clay/ErasureCodeClay.cc +++ b/src/erasure-code/clay/ErasureCodeClay.cc @@ -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); diff --git a/src/erasure-code/isa/ErasureCodeIsa.cc b/src/erasure-code/isa/ErasureCodeIsa.cc index fec86a9ac2ceb..6f2f181f5f81d 100644 --- a/src/erasure-code/isa/ErasureCodeIsa.cc +++ b/src/erasure-code/isa/ErasureCodeIsa.cc @@ -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 diff --git a/src/erasure-code/jerasure/ErasureCodeJerasure.cc b/src/erasure-code/jerasure/ErasureCodeJerasure.cc index 90d0dc8797b6f..fee779047f910 100644 --- a/src/erasure-code/jerasure/ErasureCodeJerasure.cc +++ b/src/erasure-code/jerasure/ErasureCodeJerasure.cc @@ -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; } diff --git a/src/test/erasure-code/TestErasureCodeLrc.cc b/src/test/erasure-code/TestErasureCodeLrc.cc index 9df75dabc91a5..79385f33944ec 100644 --- a/src/test/erasure-code/TestErasureCodeLrc.cc +++ b/src/test/erasure-code/TestErasureCodeLrc.cc @@ -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)); } } -- 2.39.5