diff options
author | Loic Dachary <loic@dachary.org> | 2013-09-10 01:40:02 +0200 |
---|---|---|
committer | Loic Dachary <loic@dachary.org> | 2013-09-10 16:46:22 +0200 |
commit | 530fb8a51f27363f6ccf4fe5d7f214407e1ca55a (patch) | |
tree | 320507a909fbe6608c796da5fc9a23eee93485e3 | |
parent | b70cb93a685914bf79d8e048b9bae3db2051afa6 (diff) | |
download | ceph-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.cc | 52 | ||||
-rw-r--r-- | src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h | 52 | ||||
-rw-r--r-- | src/test/osd/TestErasureCodeJerasure.cc | 2 |
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> ¶meters) { + 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> ¶meters); 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> ¶meters); + 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); |