Skip to content

Commit

Permalink
Changed ECUtil::decode to handle the case where there is more helper …
Browse files Browse the repository at this point in the history
…data than needed.

Made all the helper information uniform across all helper nodes.
Authors: Myna, Elita.
Signed-off-by: Myna Vajha <mynaramana@gmail.com>
  • Loading branch information
mynaramana committed Oct 31, 2017
1 parent 1ab883b commit 23e8882
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 39 deletions.
2 changes: 1 addition & 1 deletion src/erasure-code/ErasureCode.cc
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ int ErasureCode::minimum_to_decode(const set<int> &want_to_read,
}
vector<pair<int, int>> default_subchunks;
default_subchunks.push_back(make_pair(0, get_sub_chunk_count()));
for(auto &&id:minimum_shard_ids){
for (auto &&id : minimum_shard_ids) {
minimum->insert(make_pair(id, default_subchunks));
}
return 0;
Expand Down
6 changes: 3 additions & 3 deletions src/osd/ECMsgTypes.cc
Original file line number Diff line number Diff line change
Expand Up @@ -217,10 +217,10 @@ void ECSubRead::decode(bufferlist::iterator &bl)
}
::decode(attrs_to_read, bl);
if (struct_v > 2 && struct_v > struct_compat) {
::decode(subchunks, bl);
::decode(subchunks, bl);
} else {
for (auto &&i:attrs_to_read) {
subchunks[i].push_back(make_pair(0,1));
for (auto &&i : attrs_to_read) {
subchunks[i].push_back(make_pair(0, 1));
}
}
DECODE_FINISH(bl);
Expand Down
58 changes: 23 additions & 35 deletions src/osd/ECUtil.cc
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,8 @@ int ECUtil::decode(

assert(to_decode.size());

for (auto i = to_decode.begin();
i != to_decode.end();
++i) {
if(i->second.length() == 0)
for (auto &&i : to_decode) {
if(i.second.length() == 0)
return 0;
}

Expand All @@ -69,39 +67,29 @@ int ECUtil::decode(
}

set<int> avail;
for (auto i = to_decode.begin();
i != to_decode.end();
++i) {
assert(i->second.length() != 0);
avail.insert(i->first);
for (auto &&i : to_decode) {
assert(i.second.length() != 0);
avail.insert(i.first);
}

map<int, vector<pair<int, int>>> min;
assert(ec_impl->minimum_to_decode(need, avail, &min) == 0);
int r = ec_impl->minimum_to_decode(need, avail, &min);
assert(r == 0);

int chunks_count = 0;
map<int, int> repair_data_per_chunk;
int repair_data_per_chunk = 0;
int subchunk_size = sinfo.get_chunk_size()/ec_impl->get_sub_chunk_count();

for (map<int, bufferlist>::iterator i = to_decode.begin();
i != to_decode.end();
++i) {
assert(min.find(i->first) != min.end());

int repair_subchunk_count = 0;
for (auto j = min[i->first].begin();
j != min[i->first].end(); ++j) {
repair_subchunk_count += j->second;
}
repair_data_per_chunk[i->first] = repair_subchunk_count*subchunk_size;
assert(i->second.length() % repair_data_per_chunk[i->first] == 0);

if (i == to_decode.begin()) {
chunks_count = (int) i->second.length() / repair_data_per_chunk[i->first];
}
else {
assert(chunks_count ==
(int) i->second.length() / repair_data_per_chunk[i->first]);
for (auto &&i : to_decode) {
auto found = min.find(i.first);
if (found != min.end()) {
int repair_subchunk_count = 0;
for (auto& subchunks : min[i.first]) {
repair_subchunk_count += subchunks.second;
}
repair_data_per_chunk = repair_subchunk_count * subchunk_size;
chunks_count = (int)i.second.length() / repair_data_per_chunk;
break;
}
}

Expand All @@ -111,20 +99,20 @@ int ECUtil::decode(
j != to_decode.end();
++j) {
chunks[j->first].substr_of(j->second,
i*repair_data_per_chunk[j->first],
repair_data_per_chunk[j->first]);
i*repair_data_per_chunk,
repair_data_per_chunk);
}
map<int, bufferlist> out_bls;
int r = ec_impl->decode(need, chunks, &out_bls, sinfo.get_chunk_size());
r = ec_impl->decode(need, chunks, &out_bls, sinfo.get_chunk_size());
assert(r == 0);
for (auto j = out.begin(); j != out.end(); ++j) {
assert(out_bls.count(j->first));
assert(out_bls[j->first].length() == sinfo.get_chunk_size());
j->second->claim_append(out_bls[j->first]);
}
}
for (auto i = out.begin(); i != out.end(); ++i) {
assert(i->second->length() == chunks_count*sinfo.get_chunk_size());
for (auto &&i : out) {
assert(i.second->length() == chunks_count * sinfo.get_chunk_size());
}
return 0;
}
Expand Down

0 comments on commit 23e8882

Please sign in to comment.