@@ -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
645647public:
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 (),
0 commit comments