From: Loic Dachary Date: Thu, 29 Aug 2013 12:42:39 +0000 (+0200) Subject: ErasureCodeJerasure: define technique ReedSolomonRAID6 X-Git-Tag: v0.71~129^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b70cb93a685914bf79d8e048b9bae3db2051afa6;p=ceph.git ErasureCodeJerasure: define technique ReedSolomonRAID6 technique == reed_sol_r6_op parse : default to K=7 and W=8 . If W is not 8, 16 or 32, it reverts to 8. pad_in_length : pad to a multiple of k*w*sizeof(int) prepare, jerasure_encode, jerasure_decode map directly to the matching jerasure functions https://github.com/dachary/ceph/tree/wip-5879 refs #5879 Signed-off-by: Loic Dachary --- diff --git a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc index 9cdbca67d5d63..f6bd18589d14a 100644 --- a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc +++ b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc @@ -197,3 +197,38 @@ void ErasureCodeJerasureReedSolomonVandermonde::prepare() { matrix = reed_sol_vandermonde_coding_matrix(k, m, w); } +// +// ErasureCodeJerasureReedSolomonRAID6 +// +void ErasureCodeJerasureReedSolomonRAID6::jerasure_encode(char **data, + char **coding, + int blocksize) { + reed_sol_r6_encode(k, w, data, coding, blocksize); +} + +int ErasureCodeJerasureReedSolomonRAID6::jerasure_decode(int *erasures, + char **data, + char **coding, + int blocksize) { + return jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, blocksize); +} + +unsigned ErasureCodeJerasureReedSolomonRAID6::pad_in_length(unsigned in_length) { + while (in_length%(k*w*sizeof(int)) != 0) + in_length++; + return in_length; +} + +void ErasureCodeJerasureReedSolomonRAID6::parse(const map ¶meters) { + k = to_int("erasure-code-k", parameters, DEFAULT_K); + m = 2; + w = to_int("erasure-code-w", parameters, DEFAULT_W); + if (w != 8 && w != 16 && w != 32) { + derr << "ReedSolomonRAID6: w=" << w << " must be one of {8, 16, 32} : revert to 8 " << dendl; + w = 8; + } +} + +void ErasureCodeJerasureReedSolomonRAID6::prepare() { + matrix = reed_sol_r6_coding_matrix(k, w); +} diff --git a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h index 5b058f8b54c15..8ef608d484c4a 100644 --- a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h +++ b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h @@ -92,4 +92,31 @@ public: virtual void parse(const map ¶meters); virtual void prepare(); }; + +class ErasureCodeJerasureReedSolomonRAID6 : public ErasureCodeJerasure { +public: + static const int DEFAULT_K = 7; + static const int DEFAULT_W = 8; + int *matrix; + + ErasureCodeJerasureReedSolomonRAID6() : + ErasureCodeJerasure("reed_sol_r6_op"), + matrix(0) + { } + virtual ~ErasureCodeJerasureReedSolomonRAID6() { + if (matrix) + free(matrix); + } + + virtual void jerasure_encode(char **data, + char **coding, + int blocksize); + virtual int jerasure_decode(int *erasures, + char **data, + char **coding, + int blocksize); + virtual unsigned pad_in_length(unsigned in_length); + virtual void parse(const map ¶meters); + virtual void prepare(); +}; #endif diff --git a/src/test/osd/TestErasureCodeJerasure.cc b/src/test/osd/TestErasureCodeJerasure.cc index 343d3df36d3d8..b17c7b75dba84 100644 --- a/src/test/osd/TestErasureCodeJerasure.cc +++ b/src/test/osd/TestErasureCodeJerasure.cc @@ -27,6 +27,7 @@ class ErasureCodeTest : public ::testing::Test { typedef ::testing::Types< ErasureCodeJerasureReedSolomonVandermonde, + ErasureCodeJerasureReedSolomonRAID6, > JerasureTypes; TYPED_TEST_CASE(ErasureCodeTest, JerasureTypes);