From c42aa4d0035c14a1539e9010c9833577245fc83d Mon Sep 17 00:00:00 2001 From: Myna V Date: Wed, 17 Oct 2018 10:01:22 +0530 Subject: [PATCH] erasure-code: fixing bugs in clay-code plugin * Fixes alignment issue while using clay code with jerasure, cauchy_orig * Fixes ceph_erasure_code_non_regression to adapt to new decode Signed-off-by: Myna --- src/erasure-code/clay/ErasureCodeClay.cc | 23 +++++-------------- src/erasure-code/clay/ErasureCodeClay.h | 2 -- src/test/erasure-code/TestErasureCodeClay.cc | 2 +- .../ceph_erasure_code_non_regression.cc | 2 +- 4 files changed, 8 insertions(+), 21 deletions(-) diff --git a/src/erasure-code/clay/ErasureCodeClay.cc b/src/erasure-code/clay/ErasureCodeClay.cc index d4b24b078b4..3f050c38d12 100644 --- a/src/erasure-code/clay/ErasureCodeClay.cc +++ b/src/erasure-code/clay/ErasureCodeClay.cc @@ -89,13 +89,10 @@ int ErasureCodeClay::init(ErasureCodeProfile &profile, unsigned int ErasureCodeClay::get_chunk_size(unsigned int object_size) const { - unsigned alignment = get_alignment(); - unsigned tail = object_size % alignment; - unsigned padded_length = object_size + ( tail ? ( alignment - tail ) : 0 ); - - ceph_assert(padded_length % (k*sub_chunk_no) == 0); - - return padded_length / k; + unsigned int alignment_scalar_code = pft.erasure_code->get_chunk_size(1); + unsigned int alignment = sub_chunk_no * k * alignment_scalar_code; + + return round_up_to(object_size, alignment) / k; } int ErasureCodeClay::minimum_to_decode(const set &want_to_read, @@ -118,7 +115,8 @@ int ErasureCodeClay::decode(const set &want_to_read, avail.insert(node); } - if (is_repair(want_to_read, avail)) { + if (is_repair(want_to_read, avail) && + ((unsigned int)chunk_size > chunks.begin()->second.length())) { return repair(want_to_read, chunks, decoded, chunk_size); } else { return ErasureCode::_decode(want_to_read, chunks, decoded); @@ -186,15 +184,6 @@ int ErasureCodeClay::decode_chunks(const set &want_to_read, return res; } -unsigned int ErasureCodeClay::get_alignment() const -{ - unsigned alignment = k * sub_chunk_no * w * sizeof(int); - if ((w * sizeof(int)) % LARGEST_VECTOR_WORDSIZE) { - alignment = k * sub_chunk_no * w * LARGEST_VECTOR_WORDSIZE; - } - return alignment; -} - int ErasureCodeClay::parse(ErasureCodeProfile &profile, ostream *ss) { diff --git a/src/erasure-code/clay/ErasureCodeClay.h b/src/erasure-code/clay/ErasureCodeClay.h index 80e6f4a35a6..9b23b9907c3 100644 --- a/src/erasure-code/clay/ErasureCodeClay.h +++ b/src/erasure-code/clay/ErasureCodeClay.h @@ -84,8 +84,6 @@ public: virtual int parse(ceph::ErasureCodeProfile &profile, std::ostream *ss); - unsigned get_alignment() const; - private: int minimum_to_repair(const std::set &want_to_read, const std::set &available_chunks, diff --git a/src/test/erasure-code/TestErasureCodeClay.cc b/src/test/erasure-code/TestErasureCodeClay.cc index 0a6f181c0d0..26285e6d7f2 100644 --- a/src/test/erasure-code/TestErasureCodeClay.cc +++ b/src/test/erasure-code/TestErasureCodeClay.cc @@ -464,7 +464,7 @@ TEST(ErasureCodeClay, encode) profile["m"] = "2"; EXPECT_EQ(0, clay.init(profile, &cerr)); - unsigned aligned_object_size = clay.get_alignment() * 2; + unsigned aligned_object_size = clay.get_chunk_size(1) * 2 * 2; { // // When the input bufferlist needs to be padded because diff --git a/src/test/erasure-code/ceph_erasure_code_non_regression.cc b/src/test/erasure-code/ceph_erasure_code_non_regression.cc index 410bb5ec117..3ce31b2439a 100644 --- a/src/test/erasure-code/ceph_erasure_code_non_regression.cc +++ b/src/test/erasure-code/ceph_erasure_code_non_regression.cc @@ -207,7 +207,7 @@ int ErasureCodeNonRegression::decode_erasures(ErasureCodeInterfaceRef erasure_co } map decoded; - int code = erasure_code->decode(erasures, available, &decoded, 0); + int code = erasure_code->decode(erasures, available, &decoded, available.begin()->second.length()); if (code) return code; for (set::iterator erasure = erasures.begin(); -- 2.39.5