diff options
author | Loic Dachary <loic@dachary.org> | 2013-09-23 09:16:18 +0200 |
---|---|---|
committer | Loic Dachary <loic@dachary.org> | 2013-09-24 00:08:36 +0200 |
commit | c32c51a3f3feff8d734bd9330306905888c6cf8d (patch) | |
tree | db0cd74342cc6b0c3cd1791e609b3feb97adee4b | |
parent | 97471e333e71ad0616342f45456af1f96b4928a7 (diff) | |
download | ceph-c32c51a3f3feff8d734bd9330306905888c6cf8d.tar.gz |
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 <loic@dachary.org>
-rw-r--r-- | src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc | 28 | ||||
-rw-r--r-- | src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h | 10 |
2 files changed, 16 insertions, 22 deletions
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<int> &want_to_encode, const bufferlist &in, map<int, bufferlist> *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<std::string,std::string> ¶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<std::string,std::string> ¶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<std::string,std::string> ¶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<std::string,std::string> ¶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<std::string,std::string> ¶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<std::string,std::string> ¶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<std::string,std::string> ¶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<std::string,std::string> ¶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<std::string,std::string> ¶meters); virtual void prepare(); }; |