summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoic Dachary <loic@dachary.org>2013-09-10 01:40:02 +0200
committerLoic Dachary <loic@dachary.org>2013-09-10 16:46:22 +0200
commit530fb8a51f27363f6ccf4fe5d7f214407e1ca55a (patch)
tree320507a909fbe6608c796da5fc9a23eee93485e3
parentb70cb93a685914bf79d8e048b9bae3db2051afa6 (diff)
downloadceph-530fb8a51f27363f6ccf4fe5d7f214407e1ca55a.tar.gz
ErasureCodeJerasure: define techniques CauchyOrig and CauchyGood
The technique Cauchy has two variants: ErasureCodeInterface (abstract) | -> ErasureCodeJerasure (abstract) | -> ErasureCodeJerasureCauchy (abstract) | | | -> ErasureCodeJerasureCauchyOrig | | == cauchy_orig | -> ErasureCodeJerasureCauchyGood | | == cauchy_good ErasureCodeJerasureCauchy defines the prepare_schedule method to be used by prepare method, which is the only one overloaded by ErasureCodeJerasureCauchyOrig (calling cauchy_original_coding_matrix) and ErasureCodeJerasureCauchyGood ( calling cauchy_good_general_coding_matrix). The schedule is retained for encoding and the bitmatrix for decoding. parse : default to K=7, M=3, W=8 and packetsize = 8. pad_in_length : pad to a multiple of k*w*packetsize*sizeof(int) 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.cc52
-rw-r--r--src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h52
-rw-r--r--src/test/osd/TestErasureCodeJerasure.cc2
3 files changed, 106 insertions, 0 deletions
diff --git a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc
index f6bd18589d1..6283915b65a 100644
--- a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc
+++ b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc
@@ -232,3 +232,55 @@ void ErasureCodeJerasureReedSolomonRAID6::parse(const map<std::string,std::strin
void ErasureCodeJerasureReedSolomonRAID6::prepare() {
matrix = reed_sol_r6_coding_matrix(k, w);
}
+
+//
+// ErasureCodeJerasureCauchy
+//
+void ErasureCodeJerasureCauchy::jerasure_encode(char **data,
+ char **coding,
+ int blocksize) {
+ jerasure_schedule_encode(k, m, w, schedule, data, coding, blocksize, packetsize);
+}
+
+int ErasureCodeJerasureCauchy::jerasure_decode(int *erasures,
+ char **data,
+ char **coding,
+ int blocksize) {
+ return jerasure_schedule_decode_lazy(k, m, w, bitmatrix, erasures, data, coding, blocksize, packetsize, 1);
+}
+
+unsigned ErasureCodeJerasureCauchy::pad_in_length(unsigned in_length) {
+ while (in_length%(k*w*packetsize*sizeof(int)) != 0)
+ in_length++;
+ return in_length;
+}
+
+void ErasureCodeJerasureCauchy::parse(const map<std::string,std::string> &parameters) {
+ k = to_int("erasure-code-k", parameters, DEFAULT_K);
+ m = to_int("erasure-code-m", parameters, DEFAULT_M);
+ w = to_int("erasure-code-w", parameters, DEFAULT_W);
+ packetsize = to_int("erasure-code-packetsize", parameters, DEFAULT_PACKETSIZE);
+}
+
+void ErasureCodeJerasureCauchy::prepare_schedule(int *matrix) {
+ bitmatrix = jerasure_matrix_to_bitmatrix(k, m, w, matrix);
+ schedule = jerasure_smart_bitmatrix_to_schedule(k, m, w, bitmatrix);
+}
+
+//
+// ErasureCodeJerasureCauchyOrig
+//
+void ErasureCodeJerasureCauchyOrig::prepare() {
+ int *matrix = cauchy_original_coding_matrix(k, m, w);
+ prepare_schedule(matrix);
+ free(matrix);
+}
+
+//
+// ErasureCodeJerasureCauchyGood
+//
+void ErasureCodeJerasureCauchyGood::prepare() {
+ int *matrix = cauchy_good_general_coding_matrix(k, m, w);
+ prepare_schedule(matrix);
+ free(matrix);
+}
diff --git a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h
index 8ef608d484c..5484b5e2a22 100644
--- a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h
+++ b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h
@@ -119,4 +119,56 @@ public:
virtual void parse(const map<std::string,std::string> &parameters);
virtual void prepare();
};
+
+class ErasureCodeJerasureCauchy : public ErasureCodeJerasure {
+public:
+ static const int DEFAULT_K = 7;
+ static const int DEFAULT_M = 3;
+ static const int DEFAULT_W = 8;
+ static const int DEFAULT_PACKETSIZE = 8;
+ int *bitmatrix;
+ int **schedule;
+ int packetsize;
+
+ ErasureCodeJerasureCauchy(const char *technique) :
+ ErasureCodeJerasure(technique),
+ bitmatrix(0),
+ schedule(0)
+ { }
+ virtual ~ErasureCodeJerasureCauchy() {
+ if (bitmatrix)
+ free(bitmatrix);
+ if (schedule)
+ free(schedule);
+ }
+
+ 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);
+ void prepare_schedule(int *matrix);
+};
+
+class ErasureCodeJerasureCauchyOrig : public ErasureCodeJerasureCauchy {
+public:
+ ErasureCodeJerasureCauchyOrig() :
+ ErasureCodeJerasureCauchy("cauchy_orig")
+ {}
+
+ virtual void prepare();
+};
+
+class ErasureCodeJerasureCauchyGood : public ErasureCodeJerasureCauchy {
+public:
+ ErasureCodeJerasureCauchyGood() :
+ ErasureCodeJerasureCauchy("cauchy_good")
+ {}
+
+ virtual void prepare();
+};
#endif
diff --git a/src/test/osd/TestErasureCodeJerasure.cc b/src/test/osd/TestErasureCodeJerasure.cc
index b17c7b75dba..f35c01f125d 100644
--- a/src/test/osd/TestErasureCodeJerasure.cc
+++ b/src/test/osd/TestErasureCodeJerasure.cc
@@ -28,6 +28,8 @@ class ErasureCodeTest : public ::testing::Test {
typedef ::testing::Types<
ErasureCodeJerasureReedSolomonVandermonde,
ErasureCodeJerasureReedSolomonRAID6,
+ ErasureCodeJerasureCauchyOrig,
+ ErasureCodeJerasureCauchyGood,
> JerasureTypes;
TYPED_TEST_CASE(ErasureCodeTest, JerasureTypes);