From 54394fa117bbb1c2094bb7c44dc1a0d8e7e034cb Mon Sep 17 00:00:00 2001 From: Loic Dachary Date: Tue, 3 Jun 2014 17:25:20 +0200 Subject: [PATCH] erasure-code: move to ErasureCode::to_{int,bool} The parameter parser helpers to_int and to_bool are moved from ErasureCode{Jerasure,Isa} to ErasureCode. The prototype is modified to return a status instead of the value. An error ostream is provided as the last argument because ErasureCode cannot use dout() or derr(). http://tracker.ceph.com/issues/8496 Refs: #8496 Signed-off-by: Loic Dachary --- src/erasure-code/ErasureCode.cc | 40 +++++++++++++++++++ src/erasure-code/ErasureCode.h | 11 +++++ src/erasure-code/isa/ErasureCodeIsa.cc | 26 ------------ src/erasure-code/isa/ErasureCodeIsa.h | 3 -- .../jerasure/ErasureCodeJerasure.cc | 36 ----------------- .../jerasure/ErasureCodeJerasure.h | 6 --- 6 files changed, 51 insertions(+), 71 deletions(-) diff --git a/src/erasure-code/ErasureCode.cc b/src/erasure-code/ErasureCode.cc index 0a9ccb398dfcb..95bf13a49d1e2 100644 --- a/src/erasure-code/ErasureCode.cc +++ b/src/erasure-code/ErasureCode.cc @@ -18,6 +18,7 @@ #include #include +#include "common/strtol.h" #include "ErasureCode.h" int ErasureCode::minimum_to_decode(const set &want_to_read, @@ -142,4 +143,43 @@ int ErasureCode::decode_chunks(const set &want_to_read, assert("ErasureCode::decode_chunks not implemented" == 0); } +int ErasureCode::to_int(const std::string &name, + const map ¶meters, + int *value, + int default_value, + ostream *ss) +{ + if (parameters.find(name) == parameters.end() || + parameters.find(name)->second.size() == 0) { + *value = default_value; + return 0; + } + std::string p = parameters.find(name)->second; + std::string err; + int r = strict_strtol(p.c_str(), 10, &err); + if (!err.empty()) { + *ss << "could not convert " << name << "=" << p + << " to int because " << err + << ", set to default " << default_value << std::endl; + *value = default_value; + return -EINVAL; + } + *value = r; + return 0; +} +int ErasureCode::to_bool(const std::string &name, + const map ¶meters, + bool *value, + bool default_value, + ostream *ss) +{ + if (parameters.find(name) == parameters.end() || + parameters.find(name)->second.size() == 0) { + *value = default_value; + return 0; + } + const std::string p = parameters.find(name)->second; + *value = (p == "yes") || (p == "true"); + return 0; +} diff --git a/src/erasure-code/ErasureCode.h b/src/erasure-code/ErasureCode.h index 09fa490fdfce2..97ec687aed181 100644 --- a/src/erasure-code/ErasureCode.h +++ b/src/erasure-code/ErasureCode.h @@ -55,6 +55,17 @@ namespace ceph { const map &chunks, map *decoded); + static int to_int(const std::string &name, + const map ¶meters, + int *value, + int default_value, + ostream *ss); + + static int to_bool(const std::string &name, + const map ¶meters, + bool *value, + bool default_value, + ostream *ss); }; } diff --git a/src/erasure-code/isa/ErasureCodeIsa.cc b/src/erasure-code/isa/ErasureCodeIsa.cc index ebc8b6f6a9553..8d9e7c00ba5dc 100644 --- a/src/erasure-code/isa/ErasureCodeIsa.cc +++ b/src/erasure-code/isa/ErasureCodeIsa.cc @@ -117,32 +117,6 @@ int ErasureCodeIsa::decode_chunks(const set &want_to_read, // ----------------------------------------------------------------------------- -int -ErasureCodeIsa::to_int(const std::string &name, - const map ¶meters, - int default_value) -{ - if (parameters.find(name) == parameters.end() || - parameters.find(name)->second.size() == 0) { - dout(10) << name << " defaults to " << default_value << dendl; - return default_value; - } - const std::string value = parameters.find(name)->second; - std::string p = value; - std::string err; - int r = strict_strtol(p.c_str(), 10, &err); - if (!err.empty()) { - derr << "could not convert " << name << "=" << value - << " to int because " << err - << ", set to default " << default_value << dendl; - return default_value; - } - dout(10) << name << " set to " << r << dendl; - return r; -} - -// ----------------------------------------------------------------------------- - void ErasureCodeIsaDefault::isa_encode(char **data, char **coding, diff --git a/src/erasure-code/isa/ErasureCodeIsa.h b/src/erasure-code/isa/ErasureCodeIsa.h index 96e54428aa2eb..f68fb56f9625b 100644 --- a/src/erasure-code/isa/ErasureCodeIsa.h +++ b/src/erasure-code/isa/ErasureCodeIsa.h @@ -98,9 +98,6 @@ public: virtual void prepare() = 0; - static int to_int(const std::string &name, - const map ¶meters, - int default_value); }; // ----------------------------------------------------------------------------- diff --git a/src/erasure-code/jerasure/ErasureCodeJerasure.cc b/src/erasure-code/jerasure/ErasureCodeJerasure.cc index 7fe68668c6e59..536ce2918aa44 100644 --- a/src/erasure-code/jerasure/ErasureCodeJerasure.cc +++ b/src/erasure-code/jerasure/ErasureCodeJerasure.cc @@ -119,42 +119,6 @@ int ErasureCodeJerasure::decode_chunks(const set &want_to_read, return jerasure_decode(erasures, data, coding, blocksize); } -int ErasureCodeJerasure::to_int(const std::string &name, - const map ¶meters, - int default_value) -{ - if (parameters.find(name) == parameters.end() || - parameters.find(name)->second.size() == 0) { - dout(10) << name << " defaults to " << default_value << dendl; - return default_value; - } - const std::string value = parameters.find(name)->second; - std::string p = value; - std::string err; - int r = strict_strtol(p.c_str(), 10, &err); - if (!err.empty()) { - derr << "could not convert " << name << "=" << value - << " to int because " << err - << ", set to default " << default_value << dendl; - return default_value; - } - dout(10) << name << " set to " << r << dendl; - return r; -} - -bool ErasureCodeJerasure::to_bool(const std::string &name, - const map ¶meters, - bool default_value) -{ - if (parameters.find(name) == parameters.end() || - parameters.find(name)->second.size() == 0) { - dout(10) << name << " defaults to " << default_value << dendl; - return default_value; - } - const std::string value = parameters.find(name)->second; - return (value == "yes") || (value == "1") || (value == "true"); -} - bool ErasureCodeJerasure::is_prime(int value) { int prime55[] = { diff --git a/src/erasure-code/jerasure/ErasureCodeJerasure.h b/src/erasure-code/jerasure/ErasureCodeJerasure.h index 9a554780dff31..3f39f69d936aa 100644 --- a/src/erasure-code/jerasure/ErasureCodeJerasure.h +++ b/src/erasure-code/jerasure/ErasureCodeJerasure.h @@ -70,12 +70,6 @@ public: virtual unsigned get_alignment() const = 0; virtual void parse(const map ¶meters) = 0; virtual void prepare() = 0; - static int to_int(const std::string &name, - const map ¶meters, - int default_value); - static bool to_bool(const std::string &name, - const map ¶meters, - bool default_value); static bool is_prime(int value); }; -- 2.39.5