virtual ~OMapNode() = default;
- void init_range(std::string begin, std::string end) {
- if (!this->end.empty()) {
- // this is a duplicated init.
- assert(end == this->end);
- return;
- }
- if (begin == BEGIN_KEY && end == END_KEY) {
+ void init_range(std::string _begin, std::string _end) {
+ assert(begin.empty());
+ assert(end.empty());
+ if (_begin == BEGIN_KEY && _end == END_KEY) {
root = true;
}
- this->begin = std::move(begin);
- this->end = std::move(end);
+ begin = std::move(_begin);
+ end = std::move(_end);
}
const std::string &get_begin() const {
return begin;
if (is_rewrite() && !is_btree_root()) {
auto &prior = *get_prior_instance()->template cast<OMapInnerNode>();
if (prior.base_child_t::has_parent_tracker()) {
+ assert(prior.is_seen_by_users());
// unlike fixed-kv nodes, rewriting child nodes of the omap tree
// won't affect parent nodes, so we have to manually take prior
// instances' parent trackers here.
this->child_node_t::take_parent_from_prior();
+ } else {
+ // dirty omap extent may not be accessed yet during rewrite,
+ // this means the extent may not be initalized yet as linked.
+ assert(!prior.is_seen_by_users());
}
}
}
if (this->is_valid()
&& !this->is_pending()
&& !this->is_btree_root()
+ // dirty omap extent may not be accessed/linked yet
&& this->base_child_t::has_parent_tracker()) {
this->child_node_t::destroy();
}
if (is_rewrite() && !is_btree_root()) {
auto &prior = *get_prior_instance()->template cast<OMapLeafNode>();
if (prior.base_child_t::has_parent_tracker()) {
+ assert(prior.is_seen_by_users());
// unlike fixed-kv nodes, rewriting child nodes of the omap tree
// won't affect parent nodes, so we have to manually take prior
// instances' parent trackers here.
this->child_node_t::take_parent_from_prior();
+ } else {
+ // dirty omap extent may not be accessed yet during rewrite,
+ // this means the extent may not be initalized yet as linked.
+ assert(!prior.is_seen_by_users());
}
}
}
if (this->is_valid()
&& !this->is_pending()
&& !this->is_btree_root()
+ // dirty omap extent may not be accessed/linked yet
&& this->base_child_t::has_parent_tracker()) {
this->child_node_t::destroy();
}
oc.t, laddr, size,
[begin=std::move(begin), end=std::move(end), FNAME,
oc, chp=std::move(chp)](T &extent) mutable {
+ assert(!extent.is_seen_by_users());
extent.init_range(std::move(begin), std::move(end));
- if (extent.T::base_child_t::is_parent_valid()
- || extent.is_btree_root()) {
- return;
+ if (extent.is_btree_root()) {
+ return;
}
- assert(chp);
SUBDEBUGT(seastore_omap, "linking {} to {}",
- oc.t, extent, *chp->get_parent());
+ oc.t, extent, *chp->get_parent());
+ assert(chp);
+ assert(!extent.T::base_child_t::is_parent_valid());
chp->link_child(&extent);
}
).handle_error_interruptible(