From: Samuel Just Date: Tue, 4 Feb 2014 01:09:28 +0000 (-0800) Subject: ErasureCodeJerasure: fill in decoded if all shards are included X-Git-Tag: v0.78~163^2~56 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3650da69b552c206800dcc7e8e0ff45b7f56c69e;p=ceph.git ErasureCodeJerasure: fill in decoded if all shards are included This causes it to match minimum_to_decode. Signed-off-by: Samuel Just --- diff --git a/src/erasure-code/jerasure/ErasureCodeJerasure.cc b/src/erasure-code/jerasure/ErasureCodeJerasure.cc index 9200da25ea7c..26f978dad58b 100644 --- a/src/erasure-code/jerasure/ErasureCodeJerasure.cc +++ b/src/erasure-code/jerasure/ErasureCodeJerasure.cc @@ -136,6 +136,22 @@ int ErasureCodeJerasure::decode(const set &want_to_read, const map &chunks, map *decoded) { + vector have; + have.reserve(chunks.size()); + for (map::const_iterator i = chunks.begin(); + i != chunks.end(); + ++i) { + have.push_back(i->first); + } + if (includes( + have.begin(), have.end(), want_to_read.begin(), want_to_read.end())) { + for (set::iterator i = want_to_read.begin(); + i != want_to_read.end(); + ++i) { + (*decoded)[*i] = chunks.find(*i)->second; + } + return 0; + } unsigned blocksize = (*chunks.begin()).second.length(); int erasures[k + m + 1]; int erasures_count = 0; diff --git a/src/test/erasure-code/TestErasureCodeJerasure.cc b/src/test/erasure-code/TestErasureCodeJerasure.cc index a3d603bea540..87f59667baaa 100644 --- a/src/test/erasure-code/TestErasureCodeJerasure.cc +++ b/src/test/erasure-code/TestErasureCodeJerasure.cc @@ -82,8 +82,7 @@ TYPED_TEST(ErasureCodeTest, encode_decode) EXPECT_EQ(0, jerasure.decode(set(want_to_decode, want_to_decode+2), encoded, &decoded)); - // always decode all, regardless of want_to_decode - EXPECT_EQ(4u, decoded.size()); + EXPECT_EQ(2u, decoded.size()); EXPECT_EQ(length, decoded[0].length()); EXPECT_EQ(0, strncmp(decoded[0].c_str(), in.c_str(), length)); EXPECT_EQ(0, strncmp(decoded[1].c_str(), in.c_str() + length,