]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cbj: handle remaing space (from written_to to the end of the... 48478/head
authormyoungwon oh <ohmyoungwon@gmail.com>
Fri, 21 Oct 2022 01:56:58 +0000 (10:56 +0900)
committermyoungwon oh <ohmyoungwon@gmail.com>
Fri, 21 Oct 2022 02:45:23 +0000 (11:45 +0900)
Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
src/crimson/os/seastore/journal/circular_bounded_journal.h
src/crimson/os/seastore/random_block_manager/nvme_block_device.cc
src/crimson/os/seastore/random_block_manager/rbm_device.h
src/test/crimson/seastore/test_cbjournal.cc

index e6f8f23556108be07aedfaa6082d4949c665efeb..09be167d97062d8f9a26773912c5b37b3f247dea 100644 (file)
@@ -260,6 +260,17 @@ public:
   size_t get_records_available_size() const {
     return get_records_total_size() - get_records_used_size();
   }
+  bool is_available_size(uint64_t size) {
+    auto rbm_written_to = get_rbm_addr(get_written_to());
+    auto rbm_tail = get_rbm_addr(get_dirty_tail());
+    if (rbm_written_to > rbm_tail && 
+       (get_journal_end() - rbm_written_to) < size &&
+       size > (get_records_used_size() - 
+       (get_journal_end() - rbm_written_to))) {
+      return false;
+    } 
+    return get_records_available_size() >= size;
+  }
   rbm_abs_addr get_journal_end() const {
     assert(device);
     return device->get_journal_start() + device->get_journal_size();
index 8f03db73421c1e6b23bd023b143f165a4931b1f8..8af9e7b0060941ab8a45d07aff0b5323f3cc4918 100644 (file)
@@ -366,7 +366,6 @@ namespace crimson::os::seastore::random_block_device {
 EphemeralRBMDeviceRef create_test_ephemeral(uint64_t journal_size, uint64_t data_size) {
   return EphemeralRBMDeviceRef(
     new EphemeralRBMDevice(journal_size + data_size + 
-       EphemeralRBMDevice::TEST_BLOCK_SIZE +
        random_block_device::RBMDevice::get_journal_start(),
        EphemeralRBMDevice::TEST_BLOCK_SIZE));
 }
index 77bff9bf340ce7eb1d96fc02f36cd29d95e11ea7..10a7da0969f4404af1a1f5f66d9459a696f693fa 100644 (file)
@@ -173,7 +173,7 @@ public:
     super.config.spec.id = id;
   }
   void set_journal_size(uint64_t size) {
-    super.journal_size = size + get_block_size();
+    super.journal_size = size;
   }
 };
 
index 62465e8a504b6d41d7cbebe55ad1f502efdb5aff..8ae30b01387f52ee810b91440d078d12e046c433 100644 (file)
@@ -348,7 +348,7 @@ TEST_F(cbjournal_test_t, submit_full_records)
     auto record_total_size = r_size.get_encoded_length();
 
     submit_record(std::move(rec));
-    while (record_total_size <= get_records_available_size()) {
+    while (cbj->is_available_size(record_total_size)) {
      submit_record(
        record_t {
        { generate_extent(1), generate_extent(2) },
@@ -356,7 +356,6 @@ TEST_F(cbjournal_test_t, submit_full_records)
        });
     }
 
-    uint64_t avail = get_records_available_size();
     update_journal_tail(entries.back().addr, record_total_size);
     ASSERT_EQ(get_records_total_size(),
             get_records_available_size());
@@ -368,14 +367,14 @@ TEST_F(cbjournal_test_t, submit_full_records)
       { generate_delta(20), generate_delta(21) }
       });
 
-    while (record_total_size <= get_records_available_size()) {
+    while (cbj->is_available_size(record_total_size)) {
      submit_record(
        record_t {
        { generate_extent(1), generate_extent(2) },
        { generate_delta(20), generate_delta(21) }
        });
     }
-    ASSERT_EQ(avail, get_records_available_size());
+    ASSERT_TRUE(record_total_size > get_records_available_size());
   });
 }
 
@@ -391,7 +390,7 @@ TEST_F(cbjournal_test_t, boudary_check_verify)
     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 (record_total_size <= get_records_available_size()) {
+    while (cbj->is_available_size(record_total_size)) {
      submit_record(
        record_t {
        { generate_extent(1), generate_extent(2) },
@@ -400,9 +399,11 @@ TEST_F(cbjournal_test_t, boudary_check_verify)
     }
 
     uint64_t avail = get_records_available_size();
-    update_journal_tail(entries.front().addr, record_total_size);
+    // forward 2 recod size here because 1 block is reserved between head and tail
+    update_journal_tail(entries.front().addr, record_total_size * 2);
+    entries.erase(entries.begin());
     entries.erase(entries.begin());
-    ASSERT_EQ(avail + record_total_size, get_records_available_size());
+    ASSERT_EQ(avail + (record_total_size * 2), get_records_available_size());
     avail = get_records_available_size();
     // will be appended at the begining of WAL
     submit_record(
@@ -410,7 +411,7 @@ TEST_F(cbjournal_test_t, boudary_check_verify)
       { generate_extent(1), generate_extent(2) },
       { generate_delta(20), generate_delta(21) }
       });
-    ASSERT_EQ(avail - record_total_size, get_records_available_size());
+    ASSERT_TRUE(avail - record_total_size >= get_records_available_size());
     replay_and_check();
   });
 }
@@ -451,7 +452,7 @@ TEST_F(cbjournal_test_t, replay)
     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 (record_total_size <= get_records_available_size()) {
+    while (cbj->is_available_size(record_total_size)) {
     submit_record(
       record_t {
        { generate_extent(1), generate_extent(2) },
@@ -460,16 +461,17 @@ TEST_F(cbjournal_test_t, replay)
     }
     // will be appended at the begining of WAL
     uint64_t avail = get_records_available_size();
-    update_journal_tail(entries.front().addr, record_total_size);
+    update_journal_tail(entries.front().addr, record_total_size * 2);
+    entries.erase(entries.begin());
     entries.erase(entries.begin());
-    ASSERT_EQ(avail + record_total_size, get_records_available_size());
+    ASSERT_EQ(avail + (record_total_size * 2), get_records_available_size());
     avail = get_records_available_size();
     submit_record(
       record_t {
        { generate_extent(1), generate_extent(2) },
        { generate_delta(20), generate_delta(21) }
        });
-    ASSERT_EQ(avail - record_total_size, get_records_available_size());
+    ASSERT_TRUE(avail - record_total_size >= get_records_available_size());
     cbj->close().unsafe_get0();
     replay();
   });
@@ -487,7 +489,7 @@ TEST_F(cbjournal_test_t, replay_after_reset)
     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 (record_total_size <= get_records_available_size()) {
+    while (cbj->is_available_size(record_total_size)) {
     submit_record(
       record_t {
        { generate_extent(1), generate_extent(2) },