]>
git.proxmox.com Git - ceph.git/blob - ceph/src/crimson/os/seastore/lba_manager/btree/btree_range_pin.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "crimson/common/log.h"
6 #include "crimson/os/seastore/lba_manager/btree/btree_range_pin.h"
9 seastar::logger
& logger() {
10 return crimson::get_logger(ceph_subsys_seastore_lba
);
14 namespace crimson::os::seastore::lba_manager::btree
{
16 void btree_range_pin_t::take_pin(btree_range_pin_t
&other
)
18 ceph_assert(other
.extent
);
20 other
.pins
->replace_pin(*this, other
);
24 if (other
.has_ref()) {
31 btree_range_pin_t::~btree_range_pin_t()
33 ceph_assert(!pins
== !is_linked());
36 logger().debug("{}: removing {}", __func__
, *this);
37 pins
->remove_pin(*this, true);
42 void btree_pin_set_t::replace_pin(btree_range_pin_t
&to
, btree_range_pin_t
&from
)
44 pins
.replace_node(pins
.iterator_to(from
), to
);
47 void btree_pin_set_t::remove_pin(btree_range_pin_t
&pin
, bool do_check_parent
)
49 logger().debug("{}: {}", __func__
, pin
);
50 ceph_assert(pin
.is_linked());
51 ceph_assert(pin
.pins
);
52 ceph_assert(!pin
.ref
);
57 if (do_check_parent
) {
62 btree_range_pin_t
*btree_pin_set_t::maybe_get_parent(
63 const lba_node_meta_t
&meta
)
67 auto iter
= pins
.upper_bound(cmeta
, btree_range_pin_t::meta_cmp_t());
68 if (iter
== pins
.begin()) {
72 if (iter
->range
.is_parent_of(meta
)) {
80 const btree_range_pin_t
*btree_pin_set_t::maybe_get_first_child(
81 const lba_node_meta_t
&meta
) const
83 if (meta
.depth
== 0) {
90 auto iter
= pins
.lower_bound(cmeta
, btree_range_pin_t::meta_cmp_t());
91 if (iter
== pins
.end()) {
93 } else if (meta
.is_parent_of(iter
->range
)) {
100 void btree_pin_set_t::release_if_no_children(btree_range_pin_t
&pin
)
102 ceph_assert(pin
.is_linked());
103 if (maybe_get_first_child(pin
.range
) == nullptr) {
108 void btree_pin_set_t::add_pin(btree_range_pin_t
&pin
)
110 ceph_assert(!pin
.is_linked());
111 ceph_assert(!pin
.pins
);
112 ceph_assert(!pin
.ref
);
114 auto [prev
, inserted
] = pins
.insert(pin
);
117 "{}: unable to add {} ({}), found {} ({})",
123 ceph_assert(0 == "impossible");
127 if (!pin
.is_root()) {
128 auto *parent
= maybe_get_parent(pin
.range
);
130 if (!parent
->has_ref()) {
131 logger().debug("{}: acquiring parent {}", __func__
,
132 static_cast<void*>(parent
));
133 parent
->acquire_ref();
135 logger().debug("{}: parent has ref {}", __func__
,
136 static_cast<void*>(parent
));
139 if (maybe_get_first_child(pin
.range
) != nullptr) {
140 logger().debug("{}: acquiring self {}", __func__
, pin
);
145 void btree_pin_set_t::retire(btree_range_pin_t
&pin
)
148 remove_pin(pin
, false);
151 void btree_pin_set_t::check_parent(btree_range_pin_t
&pin
)
153 auto parent
= maybe_get_parent(pin
.range
);
155 logger().debug("{}: releasing parent {}", __func__
, *parent
);
156 release_if_no_children(*parent
);