@@ -636,11 +636,11 @@ BtreeLBAManager::update_mapping(
636636 },
637637 &nextent
638638 ).si_then ([&t, laddr, prev_addr, prev_len, addr, len, checksum, FNAME](auto res) {
639- auto &result = res.map_value ;
639+ assert ( res.is_alive_mapping ()) ;
640640 DEBUGT (" laddr={}, paddr {}~0x{:x} => {}~0x{:x}, crc=0x{:x} done -- {}" ,
641- t, laddr, prev_addr, prev_len, addr, len, checksum, result );
641+ t, laddr, prev_addr, prev_len, addr, len, checksum, res. get_cursor () );
642642 return update_mapping_iertr::make_ready_future<
643- extent_ref_count_t >(result. refcount );
643+ extent_ref_count_t >(res. get_cursor (). get_refcount () );
644644 },
645645 update_mapping_iertr::pass_further{},
646646 /* ENOENT in particular should be impossible */
@@ -681,9 +681,8 @@ BtreeLBAManager::update_mappings(
681681 nullptr // all the extents should have already been
682682 // added to the fixed_kv_btree
683683 ).si_then ([&t, laddr, prev_addr, len, addr, checksum, FNAME](auto res) {
684- auto &result = res.map_value ;
685684 DEBUGT (" laddr={}, paddr {}~0x{:x} => {}, crc=0x{:x} done -- {}" ,
686- t, laddr, prev_addr, len, addr, checksum, result );
685+ t, laddr, prev_addr, len, addr, checksum, res. get_cursor () );
687686 return update_mapping_iertr::make_ready_future ();
688687 },
689688 update_mapping_iertr::pass_further{},
@@ -759,45 +758,32 @@ BtreeLBAManager::_decref_intermediate(
759758 return btree.upper_bound_right (
760759 c, addr
761760 ).si_then ([&btree, addr, len, c](auto iter) {
762- return seastar::do_with (
763- std::move (iter),
764- [&btree, addr, len, c](auto &iter) {
765- ceph_assert (!iter.is_end ());
766- laddr_t key = iter.get_key ();
767- ceph_assert (key <= addr);
768- auto val = iter.get_val ();
769- ceph_assert (key + val.len >= addr + len);
770- ceph_assert (val.pladdr .is_paddr ());
771- ceph_assert (val.refcount >= 1 );
772- val.refcount -= 1 ;
773-
774- LOG_PREFIX (BtreeLBAManager::_decref_intermediate);
775- TRACET (" decreased refcount of intermediate key {} -- {}" ,
776- c.trans ,
777- key,
778- val);
779-
780- if (!val.refcount ) {
781- return btree.remove (c, iter
782- ).si_then ([key, val] {
783- auto res = ref_update_result_t {
784- key,
785- val.refcount ,
786- val.pladdr .get_paddr (),
787- val.len
788- };
789- return ref_iertr::make_ready_future<
790- std::optional<ref_update_result_t >>(
791- std::make_optional<ref_update_result_t >(res));
792- });
793- } else {
794- return btree.update (c, iter, val
795- ).si_then ([](auto ) {
796- return ref_iertr::make_ready_future<
797- std::optional<ref_update_result_t >>(std::nullopt );
798- });
799- }
800- });
761+ ceph_assert (!iter.is_end ());
762+ laddr_t key = iter.get_key ();
763+ ceph_assert (key <= addr);
764+ auto val = iter.get_val ();
765+ ceph_assert (key + val.len >= addr + len);
766+ ceph_assert (val.pladdr .is_paddr ());
767+ ceph_assert (val.refcount >= 1 );
768+ val.refcount -= 1 ;
769+
770+ LOG_PREFIX (BtreeLBAManager::_decref_intermediate);
771+ TRACET (" decreased refcount of intermediate key {} -- {}" ,
772+ c.trans , key, val);
773+
774+ if (val.refcount == 0 ) {
775+ return btree.remove (c, iter
776+ ).si_then ([key, val] {
777+ return ref_iertr::make_ready_future<
778+ update_mapping_ret_bare_t >(key, val);
779+ });
780+ } else {
781+ return btree.update (c, iter, val
782+ ).si_then ([c](auto iter) {
783+ return ref_iertr::make_ready_future<
784+ update_mapping_ret_bare_t >(iter.get_cursor (c));
785+ });
786+ }
801787 });
802788 });
803789}
@@ -822,38 +808,26 @@ BtreeLBAManager::update_refcount(
822808 },
823809 nullptr
824810 ).si_then ([&t, addr, delta, FNAME, this , cascade_remove](auto res) {
825- auto &map_value = res.map_value ;
826- auto &mapping = res.mapping ;
827- DEBUGT (" laddr={}, delta={} done -- {}" , t, addr, delta, map_value);
828- auto fut = ref_iertr::make_ready_future<
829- std::optional<ref_update_result_t >>();
830- if (!map_value.refcount && map_value.pladdr .is_laddr () && cascade_remove) {
831- fut = _decref_intermediate (
832- t,
833- map_value.pladdr .get_laddr (),
834- map_value.len
811+ DEBUGT (" laddr={}, delta={} done -- {}" ,
812+ t, addr, delta,
813+ res.is_alive_mapping ()
814+ ? res.get_cursor ().val
815+ : res.get_removed_mapping ().map_value );
816+ if (res.is_removed_mapping () && cascade_remove &&
817+ res.get_removed_mapping ().map_value .pladdr .is_laddr ()) {
818+ auto &val = res.get_removed_mapping ().map_value ;
819+ TRACET (" decref intermediate {} -> {}" ,
820+ t, addr, val.pladdr .get_laddr ());
821+ return _decref_intermediate (t, val.pladdr .get_laddr (), val.len
822+ ).handle_error_interruptible (
823+ update_mapping_iertr::pass_further{},
824+ crimson::ct_error::assert_all{
825+ " unexpect ENOENT"
826+ }
835827 );
836828 }
837- return fut.si_then ([addr, map_value, mapping=std::move (mapping)]
838- (auto decref_intermediate_res) mutable {
839- if (map_value.pladdr .is_laddr ()
840- && decref_intermediate_res) {
841- return update_refcount_ret_bare_t {
842- *decref_intermediate_res,
843- std::move (mapping)
844- };
845- } else {
846- return update_refcount_ret_bare_t {
847- ref_update_result_t {
848- addr,
849- map_value.refcount ,
850- map_value.pladdr ,
851- map_value.len
852- },
853- std::move (mapping)
854- };
855- }
856- });
829+ return update_mapping_iertr::make_ready_future<
830+ update_mapping_ret_bare_t >(std::move (res));
857831 });
858832}
859833
@@ -865,7 +839,7 @@ BtreeLBAManager::_update_mapping(
865839 LogicalChildNode* nextent)
866840{
867841 auto c = get_context (t);
868- return with_btree_ret <LBABtree, update_mapping_ret_bare_t >(
842+ return with_btree <LBABtree>(
869843 cache,
870844 c,
871845 [f=std::move (f), c, addr, nextent](auto &btree) mutable {
@@ -885,18 +859,15 @@ BtreeLBAManager::_update_mapping(
885859 return btree.remove (
886860 c,
887861 iter
888- ).si_then ([ret] {
889- return update_mapping_ret_bare_t {
890- std::move (ret),
891- BtreeLBAMappingRef (nullptr )
892- };
862+ ).si_then ([addr, ret] {
863+ return update_mapping_ret_bare_t (addr, ret);
893864 });
894865 } else {
895866 return btree.update (
896867 c,
897868 iter,
898869 ret
899- ).si_then ([c, ret, nextent](auto iter) {
870+ ).si_then ([c, nextent](auto iter) {
900871 if (nextent) {
901872 // nextent is provided iff unlinked,
902873 // also see TM::rewrite_logical_extent()
@@ -907,10 +878,7 @@ BtreeLBAManager::_update_mapping(
907878 assert (!nextent ||
908879 (nextent->has_parent_tracker () &&
909880 nextent->get_parent_node ().get () == iter.get_leaf_node ().get ()));
910- return update_mapping_ret_bare_t {
911- std::move (ret),
912- iter.get_pin (c)
913- };
881+ return update_mapping_ret_bare_t (iter.get_cursor (c));
914882 });
915883 }
916884 });
0 commit comments