From: Loic Dachary Date: Tue, 3 Jun 2014 20:20:29 +0000 (+0200) Subject: erasure-code: parse function for the mapping parameter X-Git-Tag: v0.85~38^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=164cfe8591108b9d9b7491a83c444da0acf3b890;p=ceph.git erasure-code: parse function for the mapping parameter Each D letter is a data chunk. For instance: _DDD_DDD is going to parse into: [ 1, 2, 3, 5, 6, 7 ] the 0 and 4 positions are not used by chunks and do not show in the mapping. Implement ErasureCode::parse to support a reasonable default for the mapping parameter. Signed-off-by: Loic Dachary --- diff --git a/src/erasure-code/ErasureCode.cc b/src/erasure-code/ErasureCode.cc index 0d3f62f6354d..44da1b32746b 100644 --- a/src/erasure-code/ErasureCode.cc +++ b/src/erasure-code/ErasureCode.cc @@ -144,15 +144,36 @@ int ErasureCode::decode_chunks(const set &want_to_read, } int ErasureCode::parse(const map ¶meters, - ostream *ss) + ostream *ss) { - return 0; + return to_mapping(parameters, ss); } const vector &ErasureCode::get_chunk_mapping() const { return chunk_mapping; } +int ErasureCode::to_mapping(const map ¶meters, + ostream *ss) +{ + if (parameters.find("mapping") != parameters.end()) { + std::string mapping = parameters.find("mapping")->second; + int position = 0; + vector coding_chunk_mapping; + for(std::string::iterator it = mapping.begin(); it != mapping.end(); ++it) { + if (*it == 'D') + chunk_mapping.push_back(position); + else + coding_chunk_mapping.push_back(position); + position++; + } + chunk_mapping.insert(chunk_mapping.end(), + coding_chunk_mapping.begin(), + coding_chunk_mapping.end()); + } + return 0; +} + int ErasureCode::to_int(const std::string &name, const map ¶meters, int *value, diff --git a/src/erasure-code/ErasureCode.h b/src/erasure-code/ErasureCode.h index 637a009d78c2..dec2bd9b1a8e 100644 --- a/src/erasure-code/ErasureCode.h +++ b/src/erasure-code/ErasureCode.h @@ -64,6 +64,9 @@ namespace ceph { virtual const vector &get_chunk_mapping() const; + int to_mapping(const map ¶meters, + ostream *ss); + static int to_int(const std::string &name, const map ¶meters, int *value,