From d2b2f5dea3ffc836068798d54244f6b86f66b106 Mon Sep 17 00:00:00 2001 From: Loic Dachary Date: Wed, 18 Dec 2013 10:17:15 +0100 Subject: [PATCH] erasure-code: jerasure implementation of chunk size helpers The encode methode uses the get_chunk_size method which is a translation of the code it previously used for the same purpose. The chunk_count and chunk_data_count methods return k+m and k respectively. But that will no longer be the case after local parity is implemented. Signed-off-by: Loic Dachary --- .../ErasureCodeJerasure.cc | 23 ++++++++++++------- .../ErasureCodeJerasure.h | 20 ++++++++++++---- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc index 2659d9740de..f1de0e4f897 100644 --- a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc +++ b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc @@ -43,6 +43,15 @@ void ErasureCodeJerasure::init(const map ¶meters) prepare(); } +unsigned int ErasureCodeJerasure::get_chunk_size(unsigned int object_size) const +{ + unsigned alignment = get_alignment(); + unsigned tail = object_size % alignment; + unsigned padded_length = object_size + ( tail ? ( alignment - tail ) : 0 ); + assert(padded_length % k == 0); + return padded_length / k; +} + int ErasureCodeJerasure::minimum_to_decode(const set &want_to_read, const set &available_chunks, set *minimum) @@ -77,9 +86,8 @@ int ErasureCodeJerasure::encode(const set &want_to_encode, const bufferlist &in, map *encoded) { - unsigned alignment = get_alignment(); - unsigned tail = in.length() % alignment; - unsigned padded_length = in.length() + ( tail ? ( alignment - tail ) : 0 ); + unsigned blocksize = get_chunk_size(in.length()); + unsigned padded_length = blocksize * k; dout(10) << "encode adjusted buffer length from " << in.length() << " to " << padded_length << dendl; assert(padded_length % k == 0); @@ -90,7 +98,6 @@ int ErasureCodeJerasure::encode(const set &want_to_encode, out.push_back(pad); out.rebuild_page_aligned(); } - unsigned blocksize = padded_length / k; unsigned coding_length = blocksize * m; bufferptr coding(buffer::create_page_aligned(coding_length)); out.push_back(coding); @@ -196,7 +203,7 @@ int ErasureCodeJerasureReedSolomonVandermonde::jerasure_decode(int *erasures, erasures, data, coding, blocksize); } -unsigned ErasureCodeJerasureReedSolomonVandermonde::get_alignment() +unsigned ErasureCodeJerasureReedSolomonVandermonde::get_alignment() const { unsigned alignment = k*w*sizeof(int); if ( ((w*sizeof(int))%LARGEST_VECTOR_WORDSIZE) ) @@ -240,7 +247,7 @@ int ErasureCodeJerasureReedSolomonRAID6::jerasure_decode(int *erasures, return jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, blocksize); } -unsigned ErasureCodeJerasureReedSolomonRAID6::get_alignment() +unsigned ErasureCodeJerasureReedSolomonRAID6::get_alignment() const { unsigned alignment = k*w*sizeof(int); if ( ((w*sizeof(int))%LARGEST_VECTOR_WORDSIZE) ) @@ -285,7 +292,7 @@ int ErasureCodeJerasureCauchy::jerasure_decode(int *erasures, erasures, data, coding, blocksize, packetsize, 1); } -unsigned ErasureCodeJerasureCauchy::get_alignment() +unsigned ErasureCodeJerasureCauchy::get_alignment() const { unsigned alignment = k*w*packetsize*sizeof(int); if ( ((w*packetsize*sizeof(int))%LARGEST_VECTOR_WORDSIZE) ) @@ -355,7 +362,7 @@ int ErasureCodeJerasureLiberation::jerasure_decode(int *erasures, coding, blocksize, packetsize, 1); } -unsigned ErasureCodeJerasureLiberation::get_alignment() +unsigned ErasureCodeJerasureLiberation::get_alignment() const { unsigned alignment = k*w*packetsize*sizeof(int); if ( ((w*packetsize*sizeof(int))%LARGEST_VECTOR_WORDSIZE) ) diff --git a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h index a5f4c9f2476..a0db6a02b1c 100644 --- a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h +++ b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h @@ -32,6 +32,16 @@ public: virtual ~ErasureCodeJerasure() {} + virtual unsigned int get_chunk_count() const { + return k + m; + } + + virtual unsigned int get_data_chunk_count() const { + return k; + } + + virtual unsigned int get_chunk_size(unsigned int object_size) const; + virtual int minimum_to_decode(const set &want_to_read, const set &available_chunks, set *minimum); @@ -56,7 +66,7 @@ public: char **data, char **coding, int blocksize) = 0; - virtual unsigned get_alignment() = 0; + virtual unsigned get_alignment() const = 0; virtual void parse(const map ¶meters) = 0; virtual void prepare() = 0; static int to_int(const std::string &name, @@ -88,7 +98,7 @@ public: char **data, char **coding, int blocksize); - virtual unsigned get_alignment(); + virtual unsigned get_alignment() const; virtual void parse(const map ¶meters); virtual void prepare(); }; @@ -115,7 +125,7 @@ public: char **data, char **coding, int blocksize); - virtual unsigned get_alignment(); + virtual unsigned get_alignment() const; virtual void parse(const map ¶meters); virtual void prepare(); }; @@ -149,7 +159,7 @@ public: char **data, char **coding, int blocksize); - virtual unsigned get_alignment(); + virtual unsigned get_alignment() const; virtual void parse(const map ¶meters); void prepare_schedule(int *matrix); }; @@ -196,7 +206,7 @@ public: char **data, char **coding, int blocksize); - virtual unsigned get_alignment(); + virtual unsigned get_alignment() const; virtual void parse(const map ¶meters); virtual void prepare(); }; -- 2.47.3