From: Loic Dachary Date: Tue, 9 Sep 2014 19:43:59 +0000 (+0200) Subject: erasure-code: fix BlaumRoth sanity check on w X-Git-Tag: v0.86~75^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9e2d04f7631cc7cd8444e7329890c2429a2d944e;p=ceph.git erasure-code: fix BlaumRoth sanity check on w For the BlaumRoth technique, w+1 must be a prime. This sanity check is present in the sample code from the jerasure library but was not implemented in the jerasure plugin. The default value for w is also changed to match this constraint. The unit tests is changed to always use the default w instead of forcing it to w. http://tracker.ceph.com/issues/6754 Fixes: #6754 Signed-off-by: Loic Dachary --- diff --git a/src/erasure-code/jerasure/ErasureCodeJerasure.cc b/src/erasure-code/jerasure/ErasureCodeJerasure.cc index bc845833f319..d48e0dbe44e3 100644 --- a/src/erasure-code/jerasure/ErasureCodeJerasure.cc +++ b/src/erasure-code/jerasure/ErasureCodeJerasure.cc @@ -4,6 +4,7 @@ * Ceph distributed storage system * * Copyright (C) 2013,2014 Cloudwatt + * Copyright (C) 2014 Red Hat * * Author: Loic Dachary * @@ -451,6 +452,17 @@ void ErasureCodeJerasureLiberation::prepare() // // ErasureCodeJerasureBlaumRoth // +bool ErasureCodeJerasureBlaumRoth::check_w(ostream *ss) const +{ + if (w <= 2 || !is_prime(w+1)) { + *ss << "w=" << w << " must be greater than two and " + << "w+1 must be prime" << std::endl; + return false; + } else { + return true; + } +} + void ErasureCodeJerasureBlaumRoth::prepare() { bitmatrix = blaum_roth_coding_bitmatrix(k, w); diff --git a/src/erasure-code/jerasure/ErasureCodeJerasure.h b/src/erasure-code/jerasure/ErasureCodeJerasure.h index 8034b99385f0..4a3b337a11b9 100644 --- a/src/erasure-code/jerasure/ErasureCodeJerasure.h +++ b/src/erasure-code/jerasure/ErasureCodeJerasure.h @@ -4,6 +4,7 @@ * Ceph distributed storage system * * Copyright (C) 2013, 2014 Cloudwatt + * Copyright (C) 2014 Red Hat * * Author: Loic Dachary * @@ -234,8 +235,11 @@ class ErasureCodeJerasureBlaumRoth : public ErasureCodeJerasureLiberation { public: ErasureCodeJerasureBlaumRoth() : ErasureCodeJerasureLiberation("blaum_roth") - {} + { + DEFAULT_W = 6; + } + virtual bool check_w(ostream *ss) const; virtual void prepare(); }; diff --git a/src/test/erasure-code/TestErasureCodeJerasure.cc b/src/test/erasure-code/TestErasureCodeJerasure.cc index b7f35ac6496d..37629519c37a 100644 --- a/src/test/erasure-code/TestErasureCodeJerasure.cc +++ b/src/test/erasure-code/TestErasureCodeJerasure.cc @@ -4,6 +4,7 @@ * Ceph distributed storage system * * Copyright (C) 2013,2014 Cloudwatt + * Copyright (C) 2014 Red Hat * * Author: Loic Dachary * @@ -50,7 +51,6 @@ TYPED_TEST(ErasureCodeTest, encode_decode) map parameters; parameters["k"] = "2"; parameters["m"] = "2"; - parameters["w"] = "7"; parameters["packetsize"] = "8"; parameters["jerasure-per-chunk-alignment"] = per_chunk_alignments[per_chunk_alignment];