Skip to content

Commit efc5984

Browse files
authored
Merge pull request ceph#55888 from myoungwon/wip-seastore-cleanup-is-stable-fix
crimson/os/seastore: cleanup and use LBAMapping::is_stable() Reviewed-by: Yingxin Cheng <[email protected]>
2 parents 639d182 + 3c7ef1b commit efc5984

File tree

3 files changed

+16
-27
lines changed

3 files changed

+16
-27
lines changed

src/crimson/os/seastore/object_data_handler.cc

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,8 @@ struct overwrite_plan_t {
641641

642642
// helper member
643643
extent_len_t block_size;
644+
bool is_left_stable;
645+
bool is_right_stable;
644646

645647
public:
646648
extent_len_t get_left_size() const {
@@ -690,14 +692,15 @@ struct overwrite_plan_t {
690692
<< ", left_operation=" << overwrite_plan.left_operation
691693
<< ", right_operation=" << overwrite_plan.right_operation
692694
<< ", block_size=" << overwrite_plan.block_size
695+
<< ", is_left_stable=" << overwrite_plan.is_left_stable
696+
<< ", is_right_stable=" << overwrite_plan.is_right_stable
693697
<< ")";
694698
}
695699

696700
overwrite_plan_t(laddr_t offset,
697701
extent_len_t len,
698702
const lba_pin_list_t& pins,
699-
extent_len_t block_size,
700-
Transaction& t) :
703+
extent_len_t block_size) :
701704
pin_begin(pins.front()->get_key()),
702705
pin_end(pins.back()->get_key() + pins.back()->get_length()),
703706
left_paddr(pins.front()->get_val()),
@@ -708,9 +711,11 @@ struct overwrite_plan_t {
708711
aligned_data_end(p2roundup((uint64_t)data_end, (uint64_t)block_size)),
709712
left_operation(overwrite_operation_t::UNKNOWN),
710713
right_operation(overwrite_operation_t::UNKNOWN),
711-
block_size(block_size) {
714+
block_size(block_size),
715+
is_left_stable(pins.front()->is_stable()),
716+
is_right_stable(pins.back()->is_stable()) {
712717
validate();
713-
evaluate_operations(t);
718+
evaluate_operations();
714719
assert(left_operation != overwrite_operation_t::UNKNOWN);
715720
assert(right_operation != overwrite_operation_t::UNKNOWN);
716721
}
@@ -738,31 +743,17 @@ struct overwrite_plan_t {
738743
* original extent into at most three parts: origin-left, part-to-be-modified
739744
* and origin-right.
740745
*/
741-
void evaluate_operations(Transaction& t) {
746+
void evaluate_operations() {
742747
auto actual_write_size = get_pins_size();
743748
auto aligned_data_size = get_aligned_data_size();
744749
auto left_ext_size = get_left_extent_size();
745750
auto right_ext_size = get_right_extent_size();
746751

747-
auto can_merge = [](Transaction& t, paddr_t paddr) {
748-
CachedExtentRef ext;
749-
if (paddr.is_relative() || paddr.is_delayed()) {
750-
return true;
751-
} else if (t.get_extent(paddr, &ext) ==
752-
Transaction::get_extent_ret::PRESENT) {
753-
// FIXME: there is no need to lookup the cache if the pin can
754-
// be associated with the extent state
755-
if (ext->is_mutable()) {
756-
return true;
757-
}
758-
}
759-
return false;
760-
};
761752
if (left_paddr.is_zero()) {
762753
actual_write_size -= left_ext_size;
763754
left_ext_size = 0;
764755
left_operation = overwrite_operation_t::OVERWRITE_ZERO;
765-
} else if (can_merge(t, left_paddr)) {
756+
} else if (!is_left_stable) {
766757
aligned_data_size += left_ext_size;
767758
left_ext_size = 0;
768759
left_operation = overwrite_operation_t::MERGE_EXISTING;
@@ -772,7 +763,7 @@ struct overwrite_plan_t {
772763
actual_write_size -= right_ext_size;
773764
right_ext_size = 0;
774765
right_operation = overwrite_operation_t::OVERWRITE_ZERO;
775-
} else if (can_merge(t, right_paddr)) {
766+
} else if (!is_right_stable) {
776767
aligned_data_size += right_ext_size;
777768
right_ext_size = 0;
778769
right_operation = overwrite_operation_t::MERGE_EXISTING;
@@ -1282,7 +1273,7 @@ ObjectDataHandler::write_ret ObjectDataHandler::overwrite(
12821273
if (bl.has_value()) {
12831274
assert(bl->length() == len);
12841275
}
1285-
overwrite_plan_t overwrite_plan(offset, len, _pins, ctx.tm.get_block_size(), ctx.t);
1276+
overwrite_plan_t overwrite_plan(offset, len, _pins, ctx.tm.get_block_size());
12861277
return seastar::do_with(
12871278
std::move(_pins),
12881279
extent_to_write_list_t(),

src/crimson/os/seastore/transaction_manager.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -433,8 +433,7 @@ class TransactionManager : public ExtentCallbackInterface {
433433
ceph_assert(total_remap_len < original_len);
434434
#endif
435435

436-
// FIXME: paddr can be absolute and pending
437-
ceph_assert(pin->get_val().is_absolute());
436+
// The according extent might be stable or pending.
438437
return cache->get_extent_if_cached(
439438
t, pin->get_val(), T::TYPE
440439
).si_then([this, &t, remaps,

src/test/crimson/seastore/test_object_data_handler.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -657,10 +657,9 @@ TEST_P(object_data_handler_test_t, multiple_remap) {
657657
run_async([this] {
658658
multiple_write();
659659
auto pins = get_mappings(0, 128<<10);
660-
EXPECT_EQ(pins.size(), 10);
660+
EXPECT_EQ(pins.size(), 3);
661661

662-
size_t res[10] = {0, 4<<10, 12<<10, 20<<10, 32<<10,
663-
36<<10, 60<<10, 96<<10, 120<<10, 124<<10};
662+
size_t res[3] = {0, 120<<10, 124<<10};
664663
auto base = pins.front()->get_key();
665664
int i = 0;
666665
for (auto &pin : pins) {

0 commit comments

Comments
 (0)