From: Loic Dachary Date: Mon, 23 Sep 2013 07:16:18 +0000 (+0200) Subject: ErasureCode: optimize padding calculation X-Git-Tag: v0.71~94^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c32c51a3f3feff8d734bd9330306905888c6cf8d;p=ceph.git ErasureCode: optimize padding calculation Andreas-Joachim Peters pointed out that the ErasureCodeJerasure method pad_in_length is very inefficient for no reason. It is replaced by the alignment method and the calculation is inlined in the encode method. Signed-off-by: Loic Dachary --- diff --git a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc index 1475bed7143..2368cc6c711 100644 --- a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc +++ b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc @@ -76,7 +76,9 @@ int ErasureCodeJerasure::encode(const set &want_to_encode, const bufferlist &in, map *encoded) { - unsigned in_length = pad_in_length(in.length()); + unsigned alignment = get_alignment(); + unsigned tail = in.length() % alignment; + unsigned in_length = in.length() + ( tail ? ( alignment - tail ) : 0 ); dout(10) << "encode adjusted buffer length from " << in.length() << " to " << in_length << dendl; assert(in_length % k == 0); @@ -194,11 +196,9 @@ int ErasureCodeJerasureReedSolomonVandermonde::jerasure_decode(int *erasures, erasures, data, coding, blocksize); } -unsigned ErasureCodeJerasureReedSolomonVandermonde::pad_in_length(unsigned in_length) +unsigned ErasureCodeJerasureReedSolomonVandermonde::get_alignment() { - while (in_length%(k*w*sizeof(int)) != 0) - in_length++; - return in_length; + return k*w*sizeof(int); } void ErasureCodeJerasureReedSolomonVandermonde::parse(const map ¶meters) @@ -236,11 +236,9 @@ int ErasureCodeJerasureReedSolomonRAID6::jerasure_decode(int *erasures, return jerasure_matrix_decode(k, m, w, matrix, 1, erasures, data, coding, blocksize); } -unsigned ErasureCodeJerasureReedSolomonRAID6::pad_in_length(unsigned in_length) +unsigned ErasureCodeJerasureReedSolomonRAID6::get_alignment() { - while (in_length%(k*w*sizeof(int)) != 0) - in_length++; - return in_length; + return k*w*sizeof(int); } void ErasureCodeJerasureReedSolomonRAID6::parse(const map ¶meters) @@ -280,11 +278,9 @@ int ErasureCodeJerasureCauchy::jerasure_decode(int *erasures, erasures, data, coding, blocksize, packetsize, 1); } -unsigned ErasureCodeJerasureCauchy::pad_in_length(unsigned in_length) +unsigned ErasureCodeJerasureCauchy::get_alignment() { - while (in_length%(k*w*packetsize*sizeof(int)) != 0) - in_length++; - return in_length; + return k*w*packetsize*sizeof(int); } void ErasureCodeJerasureCauchy::parse(const map ¶meters) @@ -349,11 +345,9 @@ int ErasureCodeJerasureLiberation::jerasure_decode(int *erasures, coding, blocksize, packetsize, 1); } -unsigned ErasureCodeJerasureLiberation::pad_in_length(unsigned in_length) +unsigned ErasureCodeJerasureLiberation::get_alignment() { - while (in_length%(k*w*packetsize*sizeof(int)) != 0) - in_length++; - return in_length; + return k*w*packetsize*sizeof(int); } void ErasureCodeJerasureLiberation::parse(const map ¶meters) diff --git a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h index 7728751c383..fc76ed7b1e2 100644 --- a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h +++ b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h @@ -56,7 +56,7 @@ public: char **data, char **coding, int blocksize) = 0; - virtual unsigned pad_in_length(unsigned in_length) = 0; + virtual unsigned get_alignment() = 0; virtual void parse(const map ¶meters) = 0; virtual void prepare() = 0; static int to_int(const std::string &name, @@ -88,7 +88,7 @@ public: char **data, char **coding, int blocksize); - virtual unsigned pad_in_length(unsigned in_length); + virtual unsigned get_alignment(); virtual void parse(const map ¶meters); virtual void prepare(); }; @@ -115,7 +115,7 @@ public: char **data, char **coding, int blocksize); - virtual unsigned pad_in_length(unsigned in_length); + virtual unsigned get_alignment(); virtual void parse(const map ¶meters); virtual void prepare(); }; @@ -149,7 +149,7 @@ public: char **data, char **coding, int blocksize); - virtual unsigned pad_in_length(unsigned in_length); + virtual unsigned get_alignment(); virtual void parse(const map ¶meters); void prepare_schedule(int *matrix); }; @@ -196,7 +196,7 @@ public: char **data, char **coding, int blocksize); - virtual unsigned pad_in_length(unsigned in_length); + virtual unsigned get_alignment(); virtual void parse(const map ¶meters); virtual void prepare(); };