@@ -307,7 +307,8 @@ BtreeLBAManager::_alloc_extent(
307307 extent_len_t len,
308308 pladdr_t addr,
309309 paddr_t actual_addr,
310- LogicalCachedExtent* nextent)
310+ LogicalCachedExtent* nextent,
311+ extent_ref_count_t refcount)
311312{
312313 struct state_t {
313314 laddr_t last_end;
@@ -319,7 +320,7 @@ BtreeLBAManager::_alloc_extent(
319320 };
320321
321322 LOG_PREFIX (BtreeLBAManager::_alloc_extent);
322- TRACET (" {}~{}, hint={}" , t, addr, len, hint);
323+ TRACET (" {}~{}, hint={}, refcount={} " , t, addr, len, hint, refcount );
323324
324325 ceph_assert (actual_addr != P_ADDR_NULL ? addr.is_laddr () : addr.is_paddr ());
325326 auto c = get_context (t);
@@ -330,7 +331,7 @@ BtreeLBAManager::_alloc_extent(
330331 c,
331332 hint,
332333 [this , FNAME, c, hint, len, addr, lookup_attempts,
333- &t, nextent](auto &btree, auto &state) {
334+ &t, nextent, refcount ](auto &btree, auto &state) {
334335 return LBABtree::iterate_repeat (
335336 c,
336337 btree.upper_bound_right (c, hint),
@@ -366,12 +367,12 @@ BtreeLBAManager::_alloc_extent(
366367 interruptible::ready_future_marker{},
367368 seastar::stop_iteration::no);
368369 }
369- }).si_then ([FNAME, c, addr, len, hint, &btree, &state, nextent] {
370+ }).si_then ([FNAME, c, addr, len, hint, &btree, &state, nextent, refcount ] {
370371 return btree.insert (
371372 c,
372373 *state.insert_iter ,
373374 state.last_end ,
374- lba_map_val_t {len, pladdr_t (addr), 1 , 0 },
375+ lba_map_val_t {len, pladdr_t (addr), refcount , 0 },
375376 nextent
376377 ).si_then ([&state, FNAME, c, addr, len, hint, nextent](auto &&p) {
377378 auto [iter, inserted] = std::move (p);
@@ -553,10 +554,12 @@ BtreeLBAManager::update_mapping(
553554 return ret;
554555 },
555556 nextent
556- ).si_then ([&t, laddr, prev_addr, addr, FNAME](auto p ) {
557- auto &result = p. first ;
557+ ).si_then ([&t, laddr, prev_addr, addr, FNAME](auto res ) {
558+ auto &result = res. map_value ;
558559 DEBUGT (" laddr={}, paddr {} => {} done -- {}" ,
559560 t, laddr, prev_addr, addr, result);
561+ return update_mapping_iertr::make_ready_future<
562+ extent_ref_count_t >(result.refcount );
560563 },
561564 update_mapping_iertr::pass_further{},
562565 /* ENOENT in particular should be impossible */
@@ -616,7 +619,7 @@ void BtreeLBAManager::register_metrics()
616619 );
617620}
618621
619- BtreeLBAManager::ref_iertr::future<std::optional<std::pair< paddr_t , extent_len_t >>>
622+ BtreeLBAManager::_decref_intermediate_ret
620623BtreeLBAManager::_decref_intermediate (
621624 Transaction &t,
622625 laddr_t addr,
@@ -650,15 +653,20 @@ BtreeLBAManager::_decref_intermediate(
650653 if (!val.refcount ) {
651654 return btree.remove (c, iter
652655 ).si_then ([val] {
653- return std::make_optional<
654- std::pair<paddr_t , extent_len_t >>(
655- val.pladdr .get_paddr (), val.len );
656+ auto res = ref_update_result_t {
657+ val.refcount ,
658+ val.pladdr .get_paddr (),
659+ val.len
660+ };
661+ return ref_iertr::make_ready_future<
662+ std::optional<ref_update_result_t >>(
663+ std::make_optional<ref_update_result_t >(res));
656664 });
657665 } else {
658666 return btree.update (c, iter, val, nullptr
659667 ).si_then ([](auto ) {
660- return seastar ::make_ready_future<
661- std::optional<std::pair< paddr_t , extent_len_t > >>(std::nullopt );
668+ return ref_iertr ::make_ready_future<
669+ std::optional<ref_update_result_t >>(std::nullopt );
662670 });
663671 }
664672 });
@@ -685,36 +693,36 @@ BtreeLBAManager::update_refcount(
685693 return out;
686694 },
687695 nullptr
688- ).si_then ([&t, addr, delta, FNAME, this , cascade_remove](auto p ) {
689- auto &result = p. first ;
690- auto &mapping = p. second ;
691- DEBUGT (" laddr={}, delta={} done -- {}" , t, addr, delta, result );
696+ ).si_then ([&t, addr, delta, FNAME, this , cascade_remove](auto res ) {
697+ auto &map_value = res. map_value ;
698+ auto &mapping = res. mapping ;
699+ DEBUGT (" laddr={}, delta={} done -- {}" , t, addr, delta, map_value );
692700 auto fut = ref_iertr::make_ready_future<
693- std::optional<std::pair< paddr_t , extent_len_t > >>();
694- if (!result .refcount && result .pladdr .is_laddr () && cascade_remove) {
701+ std::optional<ref_update_result_t >>();
702+ if (!map_value .refcount && map_value .pladdr .is_laddr () && cascade_remove) {
695703 fut = _decref_intermediate (
696704 t,
697- result .pladdr .get_laddr (),
698- result .len
705+ map_value .pladdr .get_laddr (),
706+ map_value .len
699707 );
700708 }
701- return fut.si_then ([result, mapping=std::move (mapping)]
702- (auto removed) mutable {
703- if (result.pladdr .is_laddr ()
704- && removed) {
705- return std::make_pair (
706- ref_update_result_t {
707- result.refcount ,
708- removed->first ,
709- removed->second },
710- std::move (mapping));
709+ return fut.si_then ([map_value, mapping=std::move (mapping)]
710+ (auto decref_intermediate_res) mutable {
711+ if (map_value.pladdr .is_laddr ()
712+ && decref_intermediate_res) {
713+ return update_refcount_ret_bare_t {
714+ *decref_intermediate_res,
715+ std::move (mapping)
716+ };
711717 } else {
712- return std::make_pair (
713- ref_update_result_t {
714- result.refcount ,
715- result.pladdr ,
716- result.len },
717- std::move (mapping));
718+ return update_refcount_ret_bare_t {
719+ ref_update_result_t {
720+ map_value.refcount ,
721+ map_value.pladdr ,
722+ map_value.len
723+ },
724+ std::move (mapping)
725+ };
718726 }
719727 });
720728 });
@@ -728,7 +736,7 @@ BtreeLBAManager::_update_mapping(
728736 LogicalCachedExtent* nextent)
729737{
730738 auto c = get_context (t);
731- return with_btree_ret<LBABtree, _update_mapping_ret_bare >(
739+ return with_btree_ret<LBABtree, update_mapping_ret_bare_t >(
732740 cache,
733741 c,
734742 [f=std::move (f), c, addr, nextent](auto &btree) mutable {
@@ -748,8 +756,10 @@ BtreeLBAManager::_update_mapping(
748756 c,
749757 iter
750758 ).si_then ([ret] {
751- return std::make_pair (
752- std::move (ret), BtreeLBAMappingRef (nullptr ));
759+ return update_mapping_ret_bare_t {
760+ std::move (ret),
761+ BtreeLBAMappingRef (nullptr )
762+ };
753763 });
754764 } else {
755765 return btree.update (
@@ -758,8 +768,10 @@ BtreeLBAManager::_update_mapping(
758768 ret,
759769 nextent
760770 ).si_then ([c, ret](auto iter) {
761- return std::make_pair (
762- std::move (ret), iter.get_pin (c));
771+ return update_mapping_ret_bare_t {
772+ std::move (ret),
773+ iter.get_pin (c)
774+ };
763775 });
764776 }
765777 });
0 commit comments