]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
erasure-code: parse function for the mapping parameter
authorLoic Dachary <loic@dachary.org>
Tue, 3 Jun 2014 20:20:29 +0000 (22:20 +0200)
committerLoic Dachary <loic@dachary.org>
Thu, 14 Aug 2014 23:07:22 +0000 (01:07 +0200)
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 <loic@dachary.org>
src/erasure-code/ErasureCode.cc
src/erasure-code/ErasureCode.h

index 0d3f62f6354d941401c0a99c09d2f4e526fdfe91..44da1b32746b645c6a7028d6045f838bfecb6953 100644 (file)
@@ -144,15 +144,36 @@ int ErasureCode::decode_chunks(const set<int> &want_to_read,
 }
 
 int ErasureCode::parse(const map<std::string,std::string> &parameters,
- ostream *ss)
                     ostream *ss)
 {
-  return 0;
+  return to_mapping(parameters, ss);
 }
 
 const vector<int> &ErasureCode::get_chunk_mapping() const {
   return chunk_mapping;
 }
 
+int ErasureCode::to_mapping(const map<std::string,std::string> &parameters,
+                           ostream *ss)
+{
+  if (parameters.find("mapping") != parameters.end()) {
+    std::string mapping = parameters.find("mapping")->second;
+    int position = 0;
+    vector<int> 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<std::string,std::string> &parameters,
                        int *value,
index 637a009d78c2a19bffc3ea9732041899f2a2a8c9..dec2bd9b1a8eac4c5da0d35a0ee55121a53ed909 100644 (file)
@@ -64,6 +64,9 @@ namespace ceph {
 
     virtual const vector<int> &get_chunk_mapping() const;
 
+    int to_mapping(const map<std::string,std::string> &parameters,
+                  ostream *ss);
+
     static int to_int(const std::string &name,
                      const map<std::string,std::string> &parameters,
                      int *value,