]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/journal/cbj: check if batched records are written at once before...
authormyoungwon oh <ohmyoungwon@gmail.com>
Mon, 14 Aug 2023 08:10:04 +0000 (08:10 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Wed, 11 Oct 2023 11:49:52 +0000 (11:49 +0000)
Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
(cherry picked from commit ef1a6a90e0131cdf3bb96ace835f845ae23ba0ce)

src/crimson/os/seastore/journal/circular_bounded_journal.cc
src/test/crimson/seastore/test_cbjournal.cc

index 789020c20c3f8ce76b81cfb226457a576c72a015..641a314da808955397810d87cf6d5ba48748c13e 100644 (file)
@@ -263,6 +263,33 @@ bool CircularBoundedJournal::is_record_segment_seq_invalid(
       return print_invalid(r_header);
     }
   } else if (r_header.committed_to.segment_seq != cursor.seq.segment_seq) {
+    /*
+     * Assuing that seastore issues several records using submit_recods() 
+     * as shown in the following example. 
+     *
+     * Example )
+     *         a. submit_record(a);
+     *         b. submit_record(b);
+     *  c. submit_record(c);
+     *  d. roll to begin
+     *  e. submit_record(d);
+     *  f. submit_record(e);
+     *  g. submit_record(f);
+     *
+     * In this example, we need to consider the two cases.
+     * case 1)
+     *         records a - e were issued in a batch manner
+     * case 2)
+     *  When starts to submit_record(e) at step 6, submit(b) has completed its finalize phase, 
+     *  so the header of e's committed_to points to the end of b.
+     *
+     * To handle these cases correctly, the following condition is added.
+     */
+    if ((r_header.committed_to.offset >= cursor.last_committed.offset &&
+       r_header.committed_to.segment_seq == cursor.last_committed.segment_seq) &&
+       r_header.committed_to.segment_seq == cursor.seq.segment_seq - 1) {
+      return false;
+    }
     return print_invalid(r_header);
   }
   return false;
index 0e8832b9e27b5300205642fcdb0ef7c03d35a388..532ca0784450447e7f19b5b2e28e3942ed38bdd7 100644 (file)
@@ -518,3 +518,53 @@ TEST_F(cbjournal_test_t, replay_after_reset)
       get_records_used_size());
   });
 }
+
+TEST_F(cbjournal_test_t, multiple_submit_at_end)
+{
+  run_async([this] {
+    record_t rec {
+     { generate_extent(1), generate_extent(2) },
+     { generate_delta(20), generate_delta(21) }
+     };
+    auto r_size = record_group_size_t(rec.size, block_size);
+    auto record_total_size = r_size.get_encoded_length();
+    submit_record(std::move(rec));
+    while (is_available_size(record_total_size)) {
+    submit_record(
+      record_t {
+       { generate_extent(1), generate_extent(2) },
+       { generate_delta(20), generate_delta(21) }
+       });
+    }
+    update_journal_tail(entries.front().addr, record_total_size * 8);
+    for (int i = 0; i < 8; i++) {
+      entries.erase(entries.begin());
+    }
+    seastar::parallel_for_each(
+      boost::make_counting_iterator(0u),
+      boost::make_counting_iterator(4u),
+      [&](auto) {
+       return seastar::async([&] {
+         auto writes = 0;
+         while (writes < 2) {
+           record_t rec {
+            { generate_extent(1) },
+            { generate_delta(20) } };
+           submit_record(std::move(rec));
+           writes++;
+         }
+       });
+      }).get0();
+    auto old_written_to = get_written_to();
+    cbj->close().unsafe_get0();
+    cbj->replay(
+      [](const auto &offsets,
+            const auto &e,
+            auto &dirty_seq,
+            auto &alloc_seq,
+            auto last_modified) {
+      return Journal::replay_ertr::make_ready_future<bool>(true);
+    }).unsafe_get0();
+    assert(get_written_to() == old_written_to);
+  });
+}