]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ErasureCode: optimize padding calculation 619/head
authorLoic Dachary <loic@dachary.org>
Mon, 23 Sep 2013 07:16:18 +0000 (09:16 +0200)
committerLoic Dachary <loic@dachary.org>
Mon, 23 Sep 2013 22:08:36 +0000 (00:08 +0200)
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>
src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc
src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h

index 1475bed71434657d626edb321d92cc2f191d5e98..2368cc6c711619ed5eb4955f8b66f60a91a5c059 100644 (file)
@@ -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> &parameters)
@@ -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> &parameters)
@@ -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> &parameters)
@@ -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> &parameters)
index 7728751c3834e8f50a78767045e157d36a4b57d4..fc76ed7b1e21accd339cf463fede1b0a5901ae0d 100644 (file)
@@ -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> &parameters) = 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> &parameters);
   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> &parameters);
   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> &parameters);
   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> &parameters);
   virtual void prepare();
 };