diff options
author | Loic Dachary <loic@dachary.org> | 2013-08-29 13:51:49 +0200 |
---|---|---|
committer | Loic Dachary <loic@dachary.org> | 2013-09-10 16:46:22 +0200 |
commit | 65f1970a7259b28f6ea2834bebb1334aedce70dc (patch) | |
tree | 1dcda074c968d8c3482646b6400ddb1a1e1af4c1 | |
parent | c8def8604944c302dce3ea349ece4f1d5dfc5874 (diff) | |
download | ceph-65f1970a7259b28f6ea2834bebb1334aedce70dc.tar.gz |
ErasureCodeJerasure: define technique ReedSolomonVandermonde
technique == reed_sol_van
parse : default to K=7, M=3 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.cc | 36 | ||||
-rw-r--r-- | src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h | 27 | ||||
-rw-r--r-- | src/test/osd/TestErasureCodeJerasure.cc | 1 |
3 files changed, 64 insertions, 0 deletions
diff --git a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc index 5a5c4ce4e59..9cdbca67d5d 100644 --- a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc +++ b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc @@ -161,3 +161,39 @@ bool ErasureCodeJerasure::is_prime(int value) { return false; } +// +// ErasureCodeJerasureReedSolomonVandermonde +// +void ErasureCodeJerasureReedSolomonVandermonde::jerasure_encode(char **data, + char **coding, + int blocksize) { + jerasure_matrix_encode(k, m, w, matrix, data, coding, blocksize); +} + +int ErasureCodeJerasureReedSolomonVandermonde::jerasure_decode(int *erasures, + char **data, + char **coding, + int blocksize) { + return jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, blocksize); +} + +unsigned ErasureCodeJerasureReedSolomonVandermonde::pad_in_length(unsigned in_length) { + while (in_length%(k*w*sizeof(int)) != 0) + in_length++; + return in_length; +} + +void ErasureCodeJerasureReedSolomonVandermonde::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); + if (w != 8 && w != 16 && w != 32) { + derr << "ReedSolomonVandermonde: w=" << w << " must be one of {8, 16, 32} : revert to 8 " << dendl; + w = 8; + } +} + +void ErasureCodeJerasureReedSolomonVandermonde::prepare() { + matrix = reed_sol_vandermonde_coding_matrix(k, m, w); +} + diff --git a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h index 2a8ed268f8a..5b058f8b54c 100644 --- a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h +++ b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h @@ -65,4 +65,31 @@ public: static bool is_prime(int value); }; +class ErasureCodeJerasureReedSolomonVandermonde : public ErasureCodeJerasure { +public: + static const int DEFAULT_K = 7; + static const int DEFAULT_M = 3; + static const int DEFAULT_W = 8; + int *matrix; + + ErasureCodeJerasureReedSolomonVandermonde() : + ErasureCodeJerasure("reed_sol_van"), + matrix(0) + { } + virtual ~ErasureCodeJerasureReedSolomonVandermonde() { + 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> ¶meters); + virtual void prepare(); +}; #endif diff --git a/src/test/osd/TestErasureCodeJerasure.cc b/src/test/osd/TestErasureCodeJerasure.cc index 96fc834b10e..343d3df36d3 100644 --- a/src/test/osd/TestErasureCodeJerasure.cc +++ b/src/test/osd/TestErasureCodeJerasure.cc @@ -26,6 +26,7 @@ class ErasureCodeTest : public ::testing::Test { }; typedef ::testing::Types< + ErasureCodeJerasureReedSolomonVandermonde, > JerasureTypes; TYPED_TEST_CASE(ErasureCodeTest, JerasureTypes); |