From 3ec41030cce905f0f57d18efdac22ef6cc87c8c6 Mon Sep 17 00:00:00 2001 From: Loic Dachary Date: Mon, 18 May 2015 00:29:31 +0200 Subject: [PATCH] erasure-code: add sanity check to guard against k=1 Add a call to ErasureCode::sanity_check_k for the isa and jerasure plugins, with associated tests. http://tracker.ceph.com/issues/10358 Fixes: #10358 Signed-off-by: Loic Dachary --- src/erasure-code/isa/ErasureCodeIsa.cc | 1 + .../jerasure/ErasureCodeJerasure.cc | 1 + src/test/erasure-code/TestErasureCodeIsa.cc | 11 ++++++++ .../erasure-code/TestErasureCodeJerasure.cc | 12 +++++++++ src/test/mon/osd-erasure-code-profile.sh | 26 +++++++++++++++++++ 5 files changed, 51 insertions(+) diff --git a/src/erasure-code/isa/ErasureCodeIsa.cc b/src/erasure-code/isa/ErasureCodeIsa.cc index 50ad57e8eac8..acf63d86f43c 100644 --- a/src/erasure-code/isa/ErasureCodeIsa.cc +++ b/src/erasure-code/isa/ErasureCodeIsa.cc @@ -350,6 +350,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); 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 8992aa8a89f2..eb10254c064c 100644 --- a/src/erasure-code/jerasure/ErasureCodeJerasure.cc +++ b/src/erasure-code/jerasure/ErasureCodeJerasure.cc @@ -85,6 +85,7 @@ int ErasureCodeJerasure::parse(ErasureCodeProfile &profile, chunk_mapping.clear(); err = -EINVAL; } + err |= sanity_check_k(k, ss); return err; } diff --git a/src/test/erasure-code/TestErasureCodeIsa.cc b/src/test/erasure-code/TestErasureCodeIsa.cc index ce2b056da468..11ec14ebfd7b 100644 --- a/src/test/erasure-code/TestErasureCodeIsa.cc +++ b/src/test/erasure-code/TestErasureCodeIsa.cc @@ -366,6 +366,17 @@ TEST_F(IsaErasureCodeTest, encode) } } +TEST_F(IsaErasureCodeTest, sanity_check_k) +{ + ErasureCodeIsaDefault Isa(tcache); + ErasureCodeProfile profile; + profile["k"] = "1"; + profile["m"] = "1"; + ostringstream errors; + EXPECT_EQ(-EINVAL, Isa.init(profile, &errors)); + EXPECT_NE(std::string::npos, errors.str().find("must be >= 2")); +} + bool DecodeAndVerify(ErasureCodeIsaDefault& Isa, map °raded, set want_to_decode, buffer::ptr* enc, int length) { diff --git a/src/test/erasure-code/TestErasureCodeJerasure.cc b/src/test/erasure-code/TestErasureCodeJerasure.cc index 4cccb5c3f308..47b28a02e238 100644 --- a/src/test/erasure-code/TestErasureCodeJerasure.cc +++ b/src/test/erasure-code/TestErasureCodeJerasure.cc @@ -41,6 +41,18 @@ typedef ::testing::Types< > JerasureTypes; TYPED_TEST_CASE(ErasureCodeTest, JerasureTypes); +TYPED_TEST(ErasureCodeTest, sanity_check_k) +{ + TypeParam jerasure; + ErasureCodeProfile profile; + profile["k"] = "1"; + profile["m"] = "1"; + profile["packetsize"] = "8"; + ostringstream errors; + EXPECT_EQ(-EINVAL, jerasure.init(profile, &errors)); + EXPECT_NE(std::string::npos, errors.str().find("must be >= 2")); +} + TYPED_TEST(ErasureCodeTest, encode_decode) { const char *per_chunk_alignments[] = { "false", "true" }; diff --git a/src/test/mon/osd-erasure-code-profile.sh b/src/test/mon/osd-erasure-code-profile.sh index be5dbfab6648..ec5bbc4db91f 100755 --- a/src/test/mon/osd-erasure-code-profile.sh +++ b/src/test/mon/osd-erasure-code-profile.sh @@ -205,6 +205,32 @@ function TEST_format_plain() { grep "$expected" || return 1 } +function TEST_profile_k_sanity() { + local dir=$1 + local profile=profile-sanity + + run_mon $dir a || return 1 + + expect_failure $dir 'k must be a multiple of (k + m) / l' \ + ./ceph osd erasure-code-profile set $profile \ + plugin=lrc \ + l=1 \ + k=1 \ + m=1 || return 1 + + expect_failure $dir 'k=1 must be >= 2' \ + ./ceph osd erasure-code-profile set $profile \ + plugin=isa \ + k=1 \ + m=1 || return 1 + + expect_failure $dir 'k=1 must be >= 2' \ + ./ceph osd erasure-code-profile set $profile \ + plugin=jerasure \ + k=1 \ + m=1 || return 1 +} + main osd-erasure-code-profile "$@" # Local Variables: -- 2.47.3