BtreeNodeMapping<key_t, val_t>::get_logical_extent(
Transaction &t)
{
- assert(parent);
- assert(parent->is_valid());
+ ceph_assert(is_parent_valid());
assert(pos != std::numeric_limits<uint16_t>::max());
ceph_assert(t.get_trans_id() == ctx.trans.get_trans_id());
auto &p = (FixedKVNode<key_t>&)*parent;
template <typename key_t, typename val_t>
bool BtreeNodeMapping<key_t, val_t>::is_stable() const
{
- assert(parent);
- assert(parent->is_valid());
+ assert(is_parent_valid());
assert(pos != std::numeric_limits<uint16_t>::max());
auto &p = (FixedKVNode<key_t>&)*parent;
return p.is_child_stable(ctx, pos);
template <typename key_t, typename val_t>
bool BtreeNodeMapping<key_t, val_t>::is_data_stable() const
{
- assert(parent);
- assert(parent->is_valid());
+ assert(is_parent_valid());
assert(pos != std::numeric_limits<uint16_t>::max());
auto &p = (FixedKVNode<key_t>&)*parent;
return p.is_child_data_stable(ctx, pos);
get_child_ret_t<LogicalCachedExtent> get_logical_extent(Transaction&) final;
bool is_stable() const final;
bool is_data_stable() const final;
+ bool is_parent_valid() const final {
+ ceph_assert(parent);
+ if (!parent->is_valid()) {
+ return false;
+ }
+ return !is_unviewable_by_trans(*parent, ctx.trans);
+ }
};
}
Transaction &t,
LBAMappingRef pin)
{
+ ceph_assert(pin->is_parent_valid());
auto v = pin->get_logical_extent(t);
if (v.has_child()) {
return v.get_child_fut().safe_then([pin=std::move(pin)](auto extent) {
LBAMappingRef pin,
extent_types_t type)
{
+ ceph_assert(pin->is_parent_valid());
auto v = pin->get_logical_extent(t);
// checking the lba child must be atomic with creating
// and linking the absent child