default_metadata_range(dmr)
{}
+ virtual bool is_alive() const = 0;
virtual const onode_layout_t &get_layout() const = 0;
virtual onode_layout_t &get_mutable_layout(Transaction &t) = 0;
virtual ~Onode() = default;
{
return trans_intr::do_for_each(
onodes,
- [this, &trans](auto &onode) -> eagain_ifuture<> {
+ [&trans](auto &onode) -> eagain_ifuture<> {
+ if (!onode) {
+ return eagain_iertr::make_ready_future<>();
+ }
auto &flonode = static_cast<FLTreeOnode&>(*onode);
+ if (!flonode.is_alive()) {
+ return eagain_iertr::make_ready_future<>();
+ }
switch (flonode.status) {
case FLTreeOnode::status_t::MUTATED: {
flonode.populate_recorder(trans);
return eagain_iertr::make_ready_future<>();
}
- case FLTreeOnode::status_t::DELETED: {
- return tree.erase(trans, flonode);
- }
case FLTreeOnode::status_t::STABLE: {
return eagain_iertr::make_ready_future<>();
}
{
auto &flonode = static_cast<FLTreeOnode&>(*onode);
flonode.mark_delete();
- return erase_onode_iertr::now();
+ return tree.erase(trans, flonode);
}
FLTreeOnodeManager::list_onodes_ret FLTreeOnodeManager::list_onodes(
}).unsafe_get0();
std::invoke(f, t, *onode, p_kv->value);
with_trans_intr(t, [&](auto &t) {
- return manager->write_dirty(t, {onode});
+ if (onode->is_alive()) {
+ return manager->write_dirty(t, {onode});
+ } else {
+ return OnodeManager::write_dirty_iertr::now();
+ }
}).unsafe_get0();
});
}