From 23e8882882c8f2a0d99f4b17e9948aa0cd560873 Mon Sep 17 00:00:00 2001 From: Myna V Date: Mon, 30 Oct 2017 11:04:27 +0530 Subject: [PATCH] Changed ECUtil::decode to handle the case where there is more helper data than needed. Made all the helper information uniform across all helper nodes. Authors: Myna, Elita. Signed-off-by: Myna Vajha --- src/erasure-code/ErasureCode.cc | 2 +- src/osd/ECMsgTypes.cc | 6 ++-- src/osd/ECUtil.cc | 58 +++++++++++++-------------------- 3 files changed, 27 insertions(+), 39 deletions(-) diff --git a/src/erasure-code/ErasureCode.cc b/src/erasure-code/ErasureCode.cc index 4628e73cccc3e..4142da5785cf3 100644 --- a/src/erasure-code/ErasureCode.cc +++ b/src/erasure-code/ErasureCode.cc @@ -118,7 +118,7 @@ int ErasureCode::minimum_to_decode(const set &want_to_read, } vector> 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; diff --git a/src/osd/ECMsgTypes.cc b/src/osd/ECMsgTypes.cc index 68539ad9c8140..e119bb86c8a31 100644 --- a/src/osd/ECMsgTypes.cc +++ b/src/osd/ECMsgTypes.cc @@ -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); diff --git a/src/osd/ECUtil.cc b/src/osd/ECUtil.cc index c7ce7b3042cb5..361963268fb2e 100644 --- a/src/osd/ECUtil.cc +++ b/src/osd/ECUtil.cc @@ -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; } @@ -69,39 +67,29 @@ int ECUtil::decode( } set 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>> 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 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::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; } } @@ -111,11 +99,11 @@ 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 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)); @@ -123,8 +111,8 @@ int ECUtil::decode( 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; } -- 2.39.5