parameter = parameters.find("ruleset-failure-domain");
if (parameter != parameters.end())
ruleset_failure_domain = parameter->second;
- parse(parameters);
+ ostringstream ss;
+ if (parse(parameters, &ss))
+ derr << ss.str() << dendl;
prepare();
}
// -----------------------------------------------------------------------------
-void
-ErasureCodeIsaDefault::parse(const map<std::string,
- std::string> ¶meters)
+int ErasureCodeIsaDefault::parse(const map<std::string,
+ std::string> ¶meters,
+ ostream *ss)
{
- k = to_int("k", parameters, DEFAULT_K);
- m = to_int("m", parameters, DEFAULT_M);
+ int err = ErasureCode::parse(parameters, ss);
+ err |= to_int("k", parameters, &k, DEFAULT_K, ss);
+ err |= to_int("m", parameters, &m, DEFAULT_M, ss);
if (matrixtype == kVandermonde) {
- // these are verified safe values evaluted using the benchmarktool and 10*(combinatoric for maximum loss) random full erasures
+ // these are verified safe values evaluated using the
+ // benchmarktool and 10*(combinatoric for maximum loss) random
+ // full erasures
if (k > 32) {
- derr << "Vandermonde: m=" << m
- << " should be less/equal than 32 : revert to k=32" << dendl;
+ *ss << "Vandermonde: m=" << m
+ << " should be less/equal than 32 : revert to k=32" << std::endl;
k = 32;
+ err = -EINVAL;
}
if (m > 4) {
- derr << "Vandermonde: m=" << m
- << " should be less than 5 to guarantee an MDS codec: revert to m=4" << dendl;
+ *ss << "Vandermonde: m=" << m
+ << " should be less than 5 to guarantee an MDS codec:"
+ << " revert to m=4" << std::endl;
m = 4;
+ err = -EINVAL;
}
switch (m) {
case 4:
if (k > 21) {
- derr << "Vandermonde: K=" << k
- << " should be less than 22 to guarantee an MDS codec with m=4: revert to k=21" << dendl;
+ *ss << "Vandermonde: k=" << k
+ << " should be less than 22 to guarantee an MDS"
+ << " codec with m=4: revert to k=21" << std::endl;
k = 21;
+ err = -EINVAL;
}
break;
default:
;
}
}
+ return err;
}
// -----------------------------------------------------------------------------
parameter = parameters.find("ruleset-failure-domain");
if (parameter != parameters.end())
ruleset_failure_domain = parameter->second;
- parse(parameters);
+ ostringstream ss;
+ if (parse(parameters, &ss))
+ derr << ss.str() << dendl;
prepare();
}
+int ErasureCodeJerasure::parse(const map<std::string,std::string> ¶meters,
+ ostream *ss)
+{
+ int err = ErasureCode::parse(parameters, ss);
+ err |= to_int("k", parameters, &k, DEFAULT_K, ss);
+ err |= to_int("m", parameters, &m, DEFAULT_M, ss);
+ err |= to_int("w", parameters, &w, DEFAULT_W, ss);
+ return err;
+}
+
unsigned int ErasureCodeJerasure::get_chunk_size(unsigned int object_size) const
{
unsigned alignment = get_alignment();
}
}
-void ErasureCodeJerasureReedSolomonVandermonde::parse(const map<std::string,std::string> ¶meters)
+int ErasureCodeJerasureReedSolomonVandermonde::parse(const map<std::string,std::string> ¶meters,
+ ostream *ss)
{
- k = to_int("k", parameters, DEFAULT_K);
- m = to_int("m", parameters, DEFAULT_M);
- w = to_int("w", parameters, DEFAULT_W);
+ int err = ErasureCodeJerasure::parse(parameters, ss);
if (w != 8 && w != 16 && w != 32) {
- derr << "ReedSolomonVandermonde: w=" << w
- << " must be one of {8, 16, 32} : revert to " << DEFAULT_W << dendl;
+ *ss << "ReedSolomonVandermonde: w=" << w
+ << " must be one of {8, 16, 32} : revert to DEFAULT_W " << std::endl;
w = DEFAULT_W;
+ err = -EINVAL;
}
- per_chunk_alignment = to_bool("jerasure-per-chunk-alignment", parameters, false);
+ err |= to_bool("jerasure-per-chunk-alignement", parameters,
+ &per_chunk_alignment, false, ss);
+ return err;
}
void ErasureCodeJerasureReedSolomonVandermonde::prepare()
}
}
-void ErasureCodeJerasureReedSolomonRAID6::parse(const map<std::string,std::string> ¶meters)
+int ErasureCodeJerasureReedSolomonRAID6::parse(const map<std::string,std::string> ¶meters,
+ ostream *ss)
{
- k = to_int("k", parameters, DEFAULT_K);
+ int err = ErasureCodeJerasure::parse(parameters, ss);
m = 2;
- w = to_int("w", parameters, DEFAULT_W);
if (w != 8 && w != 16 && w != 32) {
- derr << "ReedSolomonRAID6: w=" << w
- << " must be one of {8, 16, 32} : revert to 8 " << dendl;
+ *ss << "ReedSolomonRAID6: w=" << w
+ << " must be one of {8, 16, 32} : revert to 8 " << std::endl;
w = 8;
+ err = -EINVAL;
}
+ return err;
}
void ErasureCodeJerasureReedSolomonRAID6::prepare()
}
}
-void ErasureCodeJerasureCauchy::parse(const map<std::string,std::string> ¶meters)
+int ErasureCodeJerasureCauchy::parse(const map<std::string,std::string> ¶meters,
+ ostream *ss)
{
- k = to_int("k", parameters, DEFAULT_K);
- m = to_int("m", parameters, DEFAULT_M);
- w = to_int("w", parameters, DEFAULT_W);
+ int err = ErasureCodeJerasure::parse(parameters, ss);
if (w != 8 && w != 16 && w != 32) {
- derr << "Cauchy: w=" << w
- << " must be one of {8, 16, 32} : revert to "
- << DEFAULT_W << dendl;
+ *ss << "Cauchy: w=" << w
+ << " must be one of {8, 16, 32} : revert to "
+ << DEFAULT_W << std::endl;
w = DEFAULT_W;
+ err = -EINVAL;
}
- packetsize = to_int("packetsize", parameters, DEFAULT_PACKETSIZE);
- per_chunk_alignment = to_bool("jerasure-per-chunk-alignment", parameters, false);
+ err |= to_int("packetsize", parameters, &packetsize, DEFAULT_PACKETSIZE, ss);
+ err |= to_bool("jerasure-per-chunk-alignement", parameters,
+ &per_chunk_alignment, false, ss);
+ return err;
}
void ErasureCodeJerasureCauchy::prepare_schedule(int *matrix)
return alignment;
}
-void ErasureCodeJerasureLiberation::parse(const map<std::string,std::string> ¶meters)
+int ErasureCodeJerasureLiberation::parse(const map<std::string,std::string> ¶meters,
+ ostream *ss)
{
- k = to_int("k", parameters, DEFAULT_K);
- m = to_int("m", parameters, DEFAULT_M);
- w = to_int("w", parameters, DEFAULT_W);
- packetsize = to_int("packetsize", parameters, DEFAULT_PACKETSIZE);
+ int err = ErasureCodeJerasure::parse(parameters, ss);
+ err |= to_int("packetsize", parameters, &packetsize, DEFAULT_PACKETSIZE, ss);
bool error = false;
if (k > w) {
- derr << "k=" << k << " must be less than or equal to w=" << w << dendl;
+ *ss << "k=" << k << " must be less than or equal to w=" << w << std::endl;
error = true;
}
if (w <= 2 || !is_prime(w)) {
- derr << "w=" << w << " must be greater than two and be prime" << dendl;
+ *ss << "w=" << w << " must be greater than two and be prime" << std::endl;
error = true;
}
if (packetsize == 0) {
- derr << "packetsize=" << packetsize << " must be set" << dendl;
+ *ss << "packetsize=" << packetsize << " must be set" << std::endl;
error = true;
}
if ((packetsize%(sizeof(int))) != 0) {
- derr << "packetsize=" << packetsize
- << " must be a multiple of sizeof(int) = " << sizeof(int) << dendl;
+ *ss << "packetsize=" << packetsize
+ << " must be a multiple of sizeof(int) = " << sizeof(int) << std::endl;
error = true;
}
if (error) {
- derr << "reverting to k=" << DEFAULT_K << ", w="
- << DEFAULT_W << ", packetsize=" << DEFAULT_PACKETSIZE << dendl;
+ *ss << "reverting to k=" << DEFAULT_K << ", w="
+ << DEFAULT_W << ", packetsize=" << DEFAULT_PACKETSIZE << std::endl;
k = DEFAULT_K;
w = DEFAULT_W;
packetsize = DEFAULT_PACKETSIZE;
+ err = -EINVAL;
}
+ return err;
}
void ErasureCodeJerasureLiberation::prepare()
//
// ErasureCodeJerasureLiber8tion
//
-void ErasureCodeJerasureLiber8tion::parse(const map<std::string,std::string> ¶meters)
+int ErasureCodeJerasureLiber8tion::parse(const map<std::string,std::string> ¶meters,
+ ostream *ss)
{
- k = to_int("k", parameters, DEFAULT_K);
+ int err = ErasureCodeJerasure::parse(parameters, ss);
m = DEFAULT_M;
w = DEFAULT_W;
- packetsize = to_int("packetsize", parameters, DEFAULT_PACKETSIZE);
+ err |= to_int("packetsize", parameters, &packetsize, DEFAULT_PACKETSIZE, ss);
bool error = false;
if (k > w) {
- derr << "k=" << k << " must be less than or equal to w=" << w << dendl;
+ *ss << "k=" << k << " must be less than or equal to w=" << w << std::endl;
error = true;
}
if (packetsize == 0) {
- derr << "packetsize=" << packetsize << " must be set" << dendl;
+ *ss << "packetsize=" << packetsize << " must be set" << std::endl;
error = true;
}
if (error) {
- derr << "reverting to k=" << DEFAULT_K << ", packetsize="
- << DEFAULT_PACKETSIZE << dendl;
+ *ss << "reverting to k=" << DEFAULT_K << ", packetsize="
+ << DEFAULT_PACKETSIZE << std::endl;
k = DEFAULT_K;
packetsize = DEFAULT_PACKETSIZE;
+ err = -EINVAL;
}
+ return err;
}
void ErasureCodeJerasureLiber8tion::prepare()
/*
* Ceph distributed storage system
*
- * Copyright (C) 2013 Cloudwatt <libre.licensing@cloudwatt.com>
+ * Copyright (C) 2013, 2014 Cloudwatt <libre.licensing@cloudwatt.com>
*
* Author: Loic Dachary <loic@dachary.org>
*
class ErasureCodeJerasure : public ErasureCode {
public:
int k;
+ int DEFAULT_K;
int m;
+ int DEFAULT_M;
int w;
+ int DEFAULT_W;
const char *technique;
string ruleset_root;
string ruleset_failure_domain;
bool per_chunk_alignment;
ErasureCodeJerasure(const char *_technique) :
+ DEFAULT_K(2),
+ DEFAULT_M(1),
+ DEFAULT_W(8),
technique(_technique),
ruleset_root("default"),
ruleset_failure_domain("host"),
virtual ~ErasureCodeJerasure() {}
+ virtual int parse(const map<std::string,std::string> ¶meters,
+ ostream *ss);
+
virtual int create_ruleset(const string &name,
CrushWrapper &crush,
ostream *ss) const;
char **coding,
int blocksize) = 0;
virtual unsigned get_alignment() const = 0;
- virtual void parse(const map<std::string,std::string> ¶meters) = 0;
virtual void prepare() = 0;
static bool is_prime(int value);
};
class ErasureCodeJerasureReedSolomonVandermonde : public ErasureCodeJerasure {
public:
- static const int DEFAULT_K = 7;
- static const int DEFAULT_M = 3;
- static const int DEFAULT_W = 8;
int *matrix;
ErasureCodeJerasureReedSolomonVandermonde() :
ErasureCodeJerasure("reed_sol_van"),
matrix(0)
- { }
+ {
+ DEFAULT_K = 7;
+ DEFAULT_M = 3;
+ DEFAULT_W = 8;
+ }
virtual ~ErasureCodeJerasureReedSolomonVandermonde() {
if (matrix)
free(matrix);
char **coding,
int blocksize);
virtual unsigned get_alignment() const;
- virtual void parse(const map<std::string,std::string> ¶meters);
+ virtual int parse(const map<std::string,std::string> ¶meters,
+ ostream *ss);
virtual void prepare();
};
class ErasureCodeJerasureReedSolomonRAID6 : public ErasureCodeJerasure {
public:
- static const int DEFAULT_K = 7;
- static const int DEFAULT_W = 8;
int *matrix;
ErasureCodeJerasureReedSolomonRAID6() :
ErasureCodeJerasure("reed_sol_r6_op"),
matrix(0)
- { }
+ {
+ DEFAULT_K = 7;
+ DEFAULT_W = 8;
+ }
virtual ~ErasureCodeJerasureReedSolomonRAID6() {
if (matrix)
free(matrix);
char **coding,
int blocksize);
virtual unsigned get_alignment() const;
- virtual void parse(const map<std::string,std::string> ¶meters);
+ virtual int parse(const map<std::string,std::string> ¶meters,
+ ostream *ss);
virtual void prepare();
};
class ErasureCodeJerasureCauchy : public ErasureCodeJerasure {
public:
- static const int DEFAULT_K = 7;
- static const int DEFAULT_M = 3;
- static const int DEFAULT_W = 8;
static const int DEFAULT_PACKETSIZE = 2048;
int *bitmatrix;
int **schedule;
ErasureCodeJerasure(technique),
bitmatrix(0),
schedule(0)
- { }
+ {
+ DEFAULT_K = 7;
+ DEFAULT_M = 3;
+ DEFAULT_W = 8;
+ }
virtual ~ErasureCodeJerasureCauchy() {
if (bitmatrix)
free(bitmatrix);
char **coding,
int blocksize);
virtual unsigned get_alignment() const;
- virtual void parse(const map<std::string,std::string> ¶meters);
+ virtual int parse(const map<std::string,std::string> ¶meters,
+ ostream *ss);
void prepare_schedule(int *matrix);
};
class ErasureCodeJerasureLiberation : public ErasureCodeJerasure {
public:
- static const int DEFAULT_K = 2;
- static const int DEFAULT_M = 2;
- static const int DEFAULT_W = 7;
static const int DEFAULT_PACKETSIZE = 2048;
int *bitmatrix;
int **schedule;
ErasureCodeJerasure(technique),
bitmatrix(0),
schedule(0)
- { }
+ {
+ DEFAULT_K = 2;
+ DEFAULT_M = 2;
+ DEFAULT_W = 7;
+ }
virtual ~ErasureCodeJerasureLiberation();
virtual void jerasure_encode(char **data,
char **coding,
int blocksize);
virtual unsigned get_alignment() const;
- virtual void parse(const map<std::string,std::string> ¶meters);
+ virtual int parse(const map<std::string,std::string> ¶meters,
+ ostream *ss);
virtual void prepare();
};
class ErasureCodeJerasureLiber8tion : public ErasureCodeJerasureLiberation {
public:
- static const int DEFAULT_K = 2;
- static const int DEFAULT_M = 2;
- static const int DEFAULT_W = 8;
-
ErasureCodeJerasureLiber8tion() :
ErasureCodeJerasureLiberation("liber8tion")
- {}
+ {
+ DEFAULT_K = 2;
+ DEFAULT_M = 2;
+ DEFAULT_W = 8;
+ }
- virtual void parse(const map<std::string,std::string> ¶meters);
+ virtual int parse(const map<std::string,std::string> ¶meters,
+ ostream *ss);
virtual void prepare();
};