From: Mykola Golub Date: Tue, 18 Jun 2019 09:24:28 +0000 (+0300) Subject: journal: properly advance read offset after skipping invalid range X-Git-Tag: v15.1.0~2424^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F28627%2Fhead;p=ceph.git journal: properly advance read offset after skipping invalid range Fixes: https://tracker.ceph.com/issues/40409 Signed-off-by: Mykola Golub --- diff --git a/src/journal/ObjectPlayer.cc b/src/journal/ObjectPlayer.cc index cc55674a884d..d4d9fb750b5e 100644 --- a/src/journal/ObjectPlayer.cc +++ b/src/journal/ObjectPlayer.cc @@ -172,6 +172,8 @@ int ObjectPlayer::handle_fetch_complete(int r, const bufferlist &bl, m_invalid_ranges.insert(invalid_start_off, invalid_end_off - invalid_start_off); invalid = false; + + m_read_bl_off = invalid_end_off; } EntryKey entry_key(std::make_pair(entry.get_tag_tid(), diff --git a/src/test/journal/test_ObjectPlayer.cc b/src/test/journal/test_ObjectPlayer.cc index 3c255c9ed6cc..b78bd219f85a 100644 --- a/src/test/journal/test_ObjectPlayer.cc +++ b/src/test/journal/test_ObjectPlayer.cc @@ -155,21 +155,25 @@ TYPED_TEST(TestObjectPlayer, FetchCorrupt) { journal::Entry entry1(234, 123, this->create_payload(std::string(24, '1'))); journal::Entry entry2(234, 124, this->create_payload(std::string(24, '2'))); + journal::Entry entry3(234, 125, this->create_payload(std::string(24, '3'))); bufferlist bl; encode(entry1, bl); - encode(this->create_payload("corruption"), bl); + encode(this->create_payload("corruption" + std::string(1024, 'X')), bl); encode(entry2, bl); + encode(this->create_payload("corruption" + std::string(1024, 'Y')), bl); + encode(entry3, bl); ASSERT_EQ(0, this->append(this->get_object_name(oid), bl)); journal::ObjectPlayerPtr object = this->create_object(oid, 14); ASSERT_EQ(-EBADMSG, this->fetch(object)); + ASSERT_EQ(0, this->fetch(object)); journal::ObjectPlayer::Entries entries; object->get_entries(&entries); - ASSERT_EQ(2U, entries.size()); + ASSERT_EQ(3U, entries.size()); - journal::ObjectPlayer::Entries expected_entries = {entry1, entry2}; + journal::ObjectPlayer::Entries expected_entries = {entry1, entry2, entry3}; ASSERT_EQ(expected_entries, entries); }