From 848c9a684e486cb2128d7efa932caa899c100186 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Tue, 18 Jun 2019 12:24:28 +0300 Subject: [PATCH] journal: properly advance read offset after skipping invalid range Fixes: https://tracker.ceph.com/issues/40409 Signed-off-by: Mykola Golub (cherry picked from commit 7b8fd11fc6f49ca69a8484ee4b175b530b2dd2a3) --- src/journal/ObjectPlayer.cc | 2 ++ src/test/journal/test_ObjectPlayer.cc | 10 +++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/journal/ObjectPlayer.cc b/src/journal/ObjectPlayer.cc index d5a8b0d6078e2..f00bf16460576 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 3c255c9ed6ccf..b78bd219f85ad 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); } -- 2.39.5