Skip to content

Commit 66f29b7

Browse files
zhscnMatan-B
authored andcommitted
crimson/os/seastore/BtreeLBAManager: refactor update_mapping_ret_bare_t
Signed-off-by: Zhang Song <[email protected]> (cherry picked from commit 98df29e)
1 parent f578d35 commit 66f29b7

File tree

2 files changed

+116
-101
lines changed

2 files changed

+116
-101
lines changed

src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc

Lines changed: 53 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -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
});

src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h

Lines changed: 63 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ class BtreeLBAManager : public LBAManager {
188188
laddr_t addr) final {
189189
return update_refcount(t, addr, -1, true
190190
).si_then([](auto res) {
191-
return std::move(res.ref_update_res);
191+
return ref_update_result_t(res);
192192
});
193193
}
194194

@@ -408,18 +408,69 @@ class BtreeLBAManager : public LBAManager {
408408
seastar::metrics::metric_group metrics;
409409
void register_metrics();
410410

411-
/**
412-
* update_refcount
413-
*
414-
* Updates refcount, returns resulting refcount
415-
*/
416-
struct update_refcount_ret_bare_t {
417-
ref_update_result_t ref_update_res;
418-
BtreeLBAMappingRef mapping;
411+
struct update_mapping_ret_bare_t {
412+
update_mapping_ret_bare_t()
413+
: update_mapping_ret_bare_t(LBACursorRef(nullptr)) {}
414+
415+
update_mapping_ret_bare_t(LBACursorRef cursor)
416+
: ret(std::move(cursor)) {}
417+
418+
update_mapping_ret_bare_t(laddr_t laddr, lba_map_val_t value)
419+
: ret(removed_mapping_t{laddr, value}) {}
420+
421+
struct removed_mapping_t {
422+
laddr_t laddr;
423+
lba_map_val_t map_value;
424+
};
425+
std::variant<removed_mapping_t, LBACursorRef> ret;
426+
427+
bool is_removed_mapping() const {
428+
return ret.index() == 0;
429+
}
430+
431+
bool is_alive_mapping() const {
432+
if (ret.index() == 1) {
433+
assert(std::get<1>(ret));
434+
return true;
435+
} else {
436+
return false;
437+
}
438+
}
439+
440+
const removed_mapping_t& get_removed_mapping() const {
441+
assert(is_removed_mapping());
442+
return std::get<0>(ret);
443+
}
444+
445+
const LBACursor& get_cursor() const {
446+
assert(is_alive_mapping());
447+
return *std::get<1>(ret);
448+
}
449+
450+
LBACursorRef take_cursor() {
451+
assert(is_alive_mapping());
452+
return std::move(std::get<1>(ret));
453+
}
454+
455+
explicit operator ref_update_result_t() const {
456+
if (is_removed_mapping()) {
457+
auto v = get_removed_mapping();
458+
auto &val = v.map_value;
459+
ceph_assert(val.pladdr.is_paddr());
460+
return {v.laddr, val.refcount, val.pladdr, val.len};
461+
} else {
462+
assert(is_alive_mapping());
463+
auto &c = get_cursor();
464+
assert(c.val);
465+
ceph_assert(!c.is_indirect());
466+
return {c.get_laddr(), c.val->refcount, c.val->pladdr, c.val->len};
467+
}
468+
}
419469
};
470+
420471
using update_refcount_iertr = ref_iertr;
421472
using update_refcount_ret = update_refcount_iertr::future<
422-
update_refcount_ret_bare_t>;
473+
update_mapping_ret_bare_t>;
423474
update_refcount_ret update_refcount(
424475
Transaction &t,
425476
laddr_t addr,
@@ -431,10 +482,6 @@ class BtreeLBAManager : public LBAManager {
431482
*
432483
* Updates mapping, removes if f returns nullopt
433484
*/
434-
struct update_mapping_ret_bare_t {
435-
lba_map_val_t map_value;
436-
BtreeLBAMappingRef mapping;
437-
};
438485
using _update_mapping_iertr = ref_iertr;
439486
using _update_mapping_ret = ref_iertr::future<
440487
update_mapping_ret_bare_t>;
@@ -521,7 +568,7 @@ class BtreeLBAManager : public LBAManager {
521568
ceph_assert(delta > 0);
522569
return update_refcount(t, addr, delta, false
523570
).si_then([](auto res) {
524-
return std::move(res.ref_update_res);
571+
return ref_update_result_t(res);
525572
});
526573
}
527574

@@ -582,7 +629,7 @@ class BtreeLBAManager : public LBAManager {
582629
const LBACursor& indirect_cursor);
583630

584631
using _decref_intermediate_ret = ref_iertr::future<
585-
std::optional<ref_update_result_t>>;
632+
update_mapping_ret_bare_t>;
586633
_decref_intermediate_ret _decref_intermediate(
587634
Transaction &t,
588635
laddr_t addr,

0 commit comments

Comments
 (0)