From d911641ccb53558c662d62bcba0d2fa279f83585 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Thu, 29 Oct 2015 16:07:23 +0200 Subject: [PATCH] journal: update allocated tid when skipping committed entry in player Otherwise, if on image open, there are no any uncommitted entries in journal, allocated tid is not updated to the latest commited and recording always starts from tid=0. Signed-off-by: Mykola Golub --- src/journal/JournalPlayer.cc | 1 + src/test/journal/test_JournalPlayer.cc | 33 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/journal/JournalPlayer.cc b/src/journal/JournalPlayer.cc index 5060117c11ab9..2f971588abc7e 100644 --- a/src/journal/JournalPlayer.cc +++ b/src/journal/JournalPlayer.cc @@ -242,6 +242,7 @@ int JournalPlayer::process_prefetch() { } ldout(m_cct, 20) << "skipping committed entry: " << entry << dendl; + m_journal_metadata->reserve_tid(entry.get_tag(), entry.get_tid()); object_player->pop_front(); } diff --git a/src/test/journal/test_JournalPlayer.cc b/src/test/journal/test_JournalPlayer.cc index 8dcb95f63e5d2..adc445a6e9524 100644 --- a/src/test/journal/test_JournalPlayer.cc +++ b/src/test/journal/test_JournalPlayer.cc @@ -184,6 +184,39 @@ TEST_F(TestJournalPlayer, Prefetch) { ASSERT_EQ(125U, last_tid); } +TEST_F(TestJournalPlayer, PrefetchSkip) { + std::string oid = get_temp_oid(); + + journal::JournalPlayer::EntryPositions positions; + positions = { + cls::journal::EntryPosition("tag1", 125) }; + cls::journal::ObjectSetPosition commit_position(0, positions); + + ASSERT_EQ(0, create(oid)); + ASSERT_EQ(0, client_register(oid)); + ASSERT_EQ(0, client_commit(oid, commit_position)); + + journal::JournalMetadataPtr metadata = create_metadata(oid); + ASSERT_EQ(0, init_metadata(metadata)); + + journal::JournalPlayer *player = create_player(oid, metadata); + + ASSERT_EQ(0, write_entry(oid, 0, "tag1", 122)); + ASSERT_EQ(0, write_entry(oid, 1, "tag1", 123)); + ASSERT_EQ(0, write_entry(oid, 0, "tag1", 124)); + ASSERT_EQ(0, write_entry(oid, 1, "tag1", 125)); + + player->prefetch(); + + Entries entries; + ASSERT_TRUE(wait_for_entries(player, 0, &entries)); + ASSERT_TRUE(wait_for_complete(player)); + + uint64_t last_tid; + ASSERT_TRUE(metadata->get_last_allocated_tid("tag1", &last_tid)); + ASSERT_EQ(125U, last_tid); +} + TEST_F(TestJournalPlayer, PrefetchWithoutCommit) { std::string oid = get_temp_oid(); -- 2.39.5