From: myoungwon oh Date: Fri, 21 Oct 2022 01:56:58 +0000 (+0900) Subject: crimson/os/seastore/cbj: handle remaing space (from written_to to the end of the... X-Git-Tag: v18.1.0~974^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=683234358c6ceed5254b77265c40cb451a7aecd5;p=ceph.git crimson/os/seastore/cbj: handle remaing space (from written_to to the end of the journal) is less than the requested size Signed-off-by: Myoungwon Oh --- diff --git a/src/crimson/os/seastore/journal/circular_bounded_journal.h b/src/crimson/os/seastore/journal/circular_bounded_journal.h index e6f8f2355610..09be167d9706 100644 --- a/src/crimson/os/seastore/journal/circular_bounded_journal.h +++ b/src/crimson/os/seastore/journal/circular_bounded_journal.h @@ -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(); diff --git a/src/crimson/os/seastore/random_block_manager/nvme_block_device.cc b/src/crimson/os/seastore/random_block_manager/nvme_block_device.cc index 8f03db73421c..8af9e7b00609 100644 --- a/src/crimson/os/seastore/random_block_manager/nvme_block_device.cc +++ b/src/crimson/os/seastore/random_block_manager/nvme_block_device.cc @@ -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)); } diff --git a/src/crimson/os/seastore/random_block_manager/rbm_device.h b/src/crimson/os/seastore/random_block_manager/rbm_device.h index 77bff9bf340c..10a7da0969f4 100644 --- a/src/crimson/os/seastore/random_block_manager/rbm_device.h +++ b/src/crimson/os/seastore/random_block_manager/rbm_device.h @@ -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; } }; diff --git a/src/test/crimson/seastore/test_cbjournal.cc b/src/test/crimson/seastore/test_cbjournal.cc index 62465e8a504b..8ae30b01387f 100644 --- a/src/test/crimson/seastore/test_cbjournal.cc +++ b/src/test/crimson/seastore/test_cbjournal.cc @@ -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) },