]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
journal: incorrectly computed object offset within set 8999/head
authorJason Dillaman <dillaman@redhat.com>
Mon, 9 May 2016 15:22:48 +0000 (11:22 -0400)
committerJason Dillaman <dillaman@redhat.com>
Mon, 9 May 2016 15:22:48 +0000 (11:22 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/journal/JournalPlayer.cc
src/test/journal/test_JournalPlayer.cc

index aee87165d86abed70ad4866ff132cf513a5f7a9c..91602ee25f9fc700d7fff119d7dbe8209a2462ae 100644 (file)
@@ -410,7 +410,7 @@ bool JournalPlayer::verify_playback_ready() {
         entry.get_entry_tid() == 0) {
       uint8_t splay_width = m_journal_metadata->get_splay_width();
       m_active_tag_tid = entry.get_tag_tid();
-      m_splay_offset = object_player->get_object_number() / splay_width;
+      m_splay_offset = object_player->get_object_number() % splay_width;
 
       ldout(m_cct, 20) << __func__ << ": new tag " << entry.get_tag_tid() << " "
                        << "detected, adjusting offset to "
index 3f992cbe586fd345bcf10c9063d633b3611e8fc0..f989dd536b7a0a770d68714c748da29cf6a6c03e 100644 (file)
@@ -403,3 +403,52 @@ TEST_F(TestJournalPlayer, PrefetchSkippedObject) {
   ASSERT_TRUE(metadata->get_last_allocated_entry_tid(234, &last_tid));
   ASSERT_EQ(126U, last_tid);
 }
+
+TEST_F(TestJournalPlayer, ImbalancedJournal) {
+  std::string oid = get_temp_oid();
+
+  journal::JournalPlayer::ObjectPositions positions = {
+    cls::journal::ObjectPosition(9, 300, 1),
+    cls::journal::ObjectPosition(8, 300, 0),
+    cls::journal::ObjectPosition(10, 200, 4334),
+    cls::journal::ObjectPosition(11, 200, 4331) };
+  cls::journal::ObjectSetPosition commit_position(positions);
+
+  ASSERT_EQ(0, create(oid, 14, 4));
+  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));
+  metadata->set_active_set(2);
+  metadata->set_minimum_set(2);
+
+  journal::JournalPlayer *player = create_player(oid, metadata);
+
+  ASSERT_EQ(0, write_entry(oid, 8, 300, 0));
+  ASSERT_EQ(0, write_entry(oid, 8, 301, 0));
+  ASSERT_EQ(0, write_entry(oid, 9, 300, 1));
+  ASSERT_EQ(0, write_entry(oid, 9, 301, 1));
+  ASSERT_EQ(0, write_entry(oid, 10, 200, 4334));
+  ASSERT_EQ(0, write_entry(oid, 10, 301, 2));
+  ASSERT_EQ(0, write_entry(oid, 11, 200, 4331));
+  ASSERT_EQ(0, write_entry(oid, 11, 301, 3));
+
+  player->prefetch();
+
+  Entries entries;
+  ASSERT_TRUE(wait_for_entries(player, 4, &entries));
+  ASSERT_TRUE(wait_for_complete(player));
+
+  Entries expected_entries;
+  expected_entries = {
+    create_entry(301, 0),
+    create_entry(301, 1),
+    create_entry(301, 2),
+    create_entry(301, 3)};
+  ASSERT_EQ(expected_entries, entries);
+
+  uint64_t last_tid;
+  ASSERT_TRUE(metadata->get_last_allocated_entry_tid(301, &last_tid));
+  ASSERT_EQ(3U, last_tid);
+}