]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ErasureCodeJerasure: define technique ReedSolomonRAID6
authorLoic Dachary <loic@dachary.org>
Thu, 29 Aug 2013 12:42:39 +0000 (14:42 +0200)
committerLoic Dachary <loic@dachary.org>
Tue, 10 Sep 2013 14:46:22 +0000 (16:46 +0200)
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>
src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc
src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h
src/test/osd/TestErasureCodeJerasure.cc

index 9cdbca67d5d633b5ef7b75ba9437c4c4977a60d8..f6bd18589d14a760de0d2b741e58889309f7360c 100644 (file)
@@ -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);
+}
index 5b058f8b54c1528a231bc9f25f234dcd770bced9..8ef608d484c4a0347d360ca06c685df0247fd3c2 100644 (file)
@@ -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
index 343d3df36d3d83e11607252368833cc3cb19cad2..b17c7b75dba8419ef62251a22b648584f64b7ff4 100644 (file)
@@ -27,6 +27,7 @@ class ErasureCodeTest : public ::testing::Test {
 
 typedef ::testing::Types<
   ErasureCodeJerasureReedSolomonVandermonde,
+  ErasureCodeJerasureReedSolomonRAID6,
 > JerasureTypes;
 TYPED_TEST_CASE(ErasureCodeTest, JerasureTypes);