summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoic Dachary <loic@dachary.org>2013-09-23 09:16:18 +0200
committerLoic Dachary <loic@dachary.org>2013-09-24 00:08:36 +0200
commitc32c51a3f3feff8d734bd9330306905888c6cf8d (patch)
treedb0cd74342cc6b0c3cd1791e609b3feb97adee4b
parent97471e333e71ad0616342f45456af1f96b4928a7 (diff)
downloadceph-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.cc28
-rw-r--r--src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.h10
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> &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)
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> &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();
};