@@ -699,13 +699,26 @@ TransactionManager::get_extents_if_live(
699699 auto pin_paddr = pin->get_val ();
700700 auto &pin_seg_paddr = pin_paddr.as_seg_paddr ();
701701 auto pin_paddr_seg_id = pin_seg_paddr.get_segment_id ();
702- auto pin_len = pin->get_length ();
702+ // auto pin_len = pin->get_length();
703703 if (pin_paddr_seg_id != paddr_seg_id) {
704704 return seastar::now ();
705705 }
706- // Only extent split can happen during the lookup
707- ceph_assert (pin_seg_paddr >= paddr &&
708- pin_seg_paddr.add_offset (pin_len) <= paddr.add_offset (len));
706+
707+ // pin may be out of the range paddr~len, consider the following scene:
708+ // 1. Trans.A writes the final record of Segment S, in which it overwrite
709+ // another extent E in the same segment S;
710+ // 2. Before Trans.A "complete_commit", Trans.B tries to rewrite new
711+ // records and roll the segments, which closes Segment S;
712+ // 3. Before Trans.A "complete_commit", a new cleaner Transaction C tries
713+ // to clean the segment;
714+ //
715+ // In this scenario, C might see a part of extent E's laddr space mapped
716+ // to another location within the same segment S.
717+ //
718+ // FIXME: this assert should be re-enabled once we have space reclaiming
719+ // recognize committed segments: https://tracker.ceph.com/issues/66941
720+ // ceph_assert(pin_seg_paddr >= paddr &&
721+ // pin_seg_paddr.add_offset(pin_len) <= paddr.add_offset(len));
709722 return read_pin_by_type (t, std::move (pin), type
710723 ).si_then ([&list](auto ret) {
711724 list.emplace_back (std::move (ret));
0 commit comments