summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoic Dachary <loic@dachary.org>2013-08-29 14:42:39 +0200
committerLoic Dachary <loic@dachary.org>2013-09-10 16:46:22 +0200
commitb70cb93a685914bf79d8e048b9bae3db2051afa6 (patch)
tree9e1ea28e852953f39f0a5c95b8f4c8d1984ae957
parent65f1970a7259b28f6ea2834bebb1334aedce70dc (diff)
downloadceph-b70cb93a685914bf79d8e048b9bae3db2051afa6.tar.gz
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 <loic@dachary.org>
-rw-r--r--src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc35
-rw-r--r--src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h27
-rw-r--r--src/test/osd/TestErasureCodeJerasure.cc1
3 files changed, 63 insertions, 0 deletions
diff --git a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc
index 9cdbca67d5d..f6bd18589d1 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<std::string,std::string> &parameters) {
+ 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 5b058f8b54c..8ef608d484c 100644
--- a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h
+++ b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h
@@ -92,4 +92,31 @@ public:
virtual void parse(const map<std::string,std::string> &parameters);
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<std::string,std::string> &parameters);
+ virtual void prepare();
+};
#endif
diff --git a/src/test/osd/TestErasureCodeJerasure.cc b/src/test/osd/TestErasureCodeJerasure.cc
index 343d3df36d3..b17c7b75dba 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);