// 2. unlink parent/super --ptr-> me
// 3. unlink me --ref-> parent/super
// 4. extent is retired
- assert(!impl->is_extent_valid());
+ assert(impl->is_extent_retired());
// TODO: maybe its possible when eagain happens internally, we should
// revisit to make sure tree operations can be aborted normally,
// without resource leak or hitting unexpected asserts.
} else {
- assert(impl->is_extent_valid());
+ assert(!impl->is_extent_retired());
if (is_root()) {
super->do_untrack_root(*this);
} else {
#ifndef NDEBUG
assert(this == cursor.get_leaf_node().get());
assert(cursor.is_tracked());
+ assert(!impl->is_extent_retired());
auto [key, p_value_header] = get_kv(cursor.get_position());
auto magic = p_value_header->magic;
assert(key.compare_to(cursor.get_key_view(magic)) == MatchKindCMP::EQ);
extent->get_recorder()->is_empty());
recorder = nullptr;
} else {
+ // extent is invalid or retired
ceph_abort("impossible path");
}
#ifndef NDEBUG
const node_stage_t& read() const { return node_stage; }
laddr_t get_laddr() const { return extent->get_laddr(); }
nextent_state_t get_state() const {
- assert(extent->is_valid());
+ assert(!is_retired());
// we cannot rely on the underlying extent state because
// FRESH/MUTATION_PENDING can become DIRTY after transaction submission.
return state;
}
- bool is_valid() const {
+ bool is_retired() const {
if (extent) {
- assert(extent->is_valid());
- return true;
- } else {
+ // XXX SeaStore extent cannot distinguish between invalid and retired.
+ // assert(extent->is_valid());
return false;
+ } else {
+ return true;
}
}
// must be called before any mutate attempes.
// for the safety of mixed read and mutate, call before read.
void prepare_mutate(context_t c) {
- assert(extent->is_valid());
+ assert(!is_retired());
if (state == nextent_state_t::READ_ONLY) {
assert(!extent->is_pending());
auto ref_recorder = recorder_t::create_for_encode(c.vb);
eagain_future<NodeExtentMutable> rebuild(context_t c) {
LOG_PREFIX(OTree::Extent::rebuild);
- assert(extent->is_valid());
+ assert(!is_retired());
if (state == nextent_state_t::FRESH) {
assert(extent->is_initial_pending());
// already fresh and no need to record
eagain_future<> retire(context_t c) {
LOG_PREFIX(OTree::Extent::retire);
- assert(extent->is_valid());
+ assert(!is_retired());
auto addr = extent->get_laddr();
return c.nm.retire_extent(c.t, std::move(extent)
).handle_error(
virtual level_t level() const = 0;
virtual node_offset_t free_size() const = 0;
virtual node_offset_t total_size() const = 0;
- virtual bool is_extent_valid() const = 0;
+ virtual bool is_extent_retired() const = 0;
virtual std::optional<key_view_t> get_pivot_index() const = 0;
virtual bool is_size_underflow() const = 0;
level_t level() const override { return extent.read().level(); }
node_offset_t free_size() const override { return extent.read().free_size(); }
node_offset_t total_size() const override { return extent.read().total_size(); }
- bool is_extent_valid() const override { return extent.is_valid(); }
+ bool is_extent_retired() const override { return extent.is_retired(); }
std::optional<key_view_t> get_pivot_index() const override {
if (is_level_tail()) {
laddr_t laddr() const override { return _laddr; }
bool is_level_tail() const override { return _is_level_tail; }
std::optional<key_view_t> get_pivot_index() const override { return {key_view}; }
- bool is_extent_valid() const override { return _is_extent_valid; }
+ bool is_extent_retired() const override { return _is_extent_retired; }
const std::string& get_name() const override { return name; }
search_position_t make_tail() override {
_is_level_tail = true;
return search_position_t::end();
}
eagain_future<> retire_extent(context_t) override {
- _is_extent_valid = false;
+ assert(!_is_extent_retired);
+ _is_extent_retired = true;
return seastar::now();
}
bool _is_level_tail;
laddr_t _laddr;
std::string name;
- bool _is_extent_valid = true;
+ bool _is_extent_retired = false;
key_view_t key_view;
void* p_mem_key_view;