assert(last != "");
return seastar::do_with(
key_range_t{first, last, 0, false, false},
- [this, &omap_root, &t, &first, &last](auto &key_range) {
+ [this, &omap_root, &t, &first, &last, FNAME](auto &key_range) {
return trans_intr::repeat(
- [this, &omap_root, &t, &key_range, &first, &last, first_enter = true]() mutable
+ [this, &omap_root, &t, &key_range, &first, &last, first_enter = true, FNAME]() mutable
{
if (first_enter) {
key_range = key_range_t{first, last, 0, false, false};
first_enter = false;
+ DEBUGT("first enter key range remove first={}, last={}, complete={}, get_next={}", t,
+ key_range.first, key_range.last, key_range.total_complete, key_range.get_next);
}
+ DEBUGT("start key range remove first={}, last={}, complete={}, get_next={}", t,
+ key_range.first, key_range.last, key_range.total_complete, key_range.get_next);
return get_omap_root(
get_omap_context(t, omap_root),
omap_root
- ).si_then([this, &omap_root, &t, &key_range](auto root) {
- key_range.root_depth = omap_root.depth;
+ ).si_then([this, &omap_root, &t, &key_range, FNAME](auto root) {
+ DEBUGT("got omap root extent {}, depth = {}", t, *root, omap_root.get_depth());
+ key_range.root_depth = omap_root.get_depth();
return root->rm_key_range(get_omap_context(t, omap_root), key_range);
- }).si_then([this, &omap_root, &t](auto mresult) ->omap_rm_key_range_ret {
+ }).si_then([this, &omap_root, &t, FNAME, &key_range](auto mresult) ->omap_rm_key_range_ret {
+ DEBUGT("after key range remove first={}, last={}, complete={}, get_next={}, depth ={}", t,
+ key_range.first, key_range.last, key_range.total_complete, key_range.get_next, key_range.root_depth);
if (mresult.status == mutation_status_t::SUCCESS) {
return seastar::now();
} else if (mresult.status == mutation_status_t::WAS_SPLIT) {
} else {
return seastar::now();
}
- }).si_then([&key_range]() -> omap_rm_key_range_iertr::future<seastar::stop_iteration> {
+ }).si_then([&key_range, &t, FNAME, this]() -> omap_rm_key_range_iertr::future<seastar::stop_iteration> {
+ DEBUGT("repeat check complete={}, get_next={}", t, key_range.total_complete, key_range.get_next);
if (key_range.total_complete) {
return omap_rm_key_range_iertr::make_ready_future<seastar::stop_iteration>(
seastar::stop_iteration::yes);
seastar::stop_iteration::no);
}
});
+ }).si_then([this, &omap_root, &t, &first, &last, &key_range, FNAME](){
+ DEBUGT("check key range remove first={}, last={}, complete={}, get_next={}, depht={}", t,
+ key_range.first, key_range.last, key_range.total_complete, key_range.get_next, key_range.root_depth);
+ auto config = OMapManager::omap_list_config_t()
+ .with_inclusive(true, false)
+ .without_max();
+ return seastar::do_with(
+ std::make_optional<std::string>(first),
+ std::make_optional<std::string>(last),
+ [this, &omap_root, &t, config](auto &first, auto &last) {
+ return omap_list(
+ omap_root,
+ t,
+ first,
+ last,
+ config).si_then([](auto results){
+ auto &[complete, kvs] = results;
+ assert(kvs.empty());
+ return seastar::now();
+ });
});
});
+ });
}
BtreeOMapManager::omap_iterate_ret
[this, oc, &key_range, child_pt] (auto extent) {
ceph_assert(!extent->is_btree_root());
return extent->rm_key_range(oc, key_range)
- .si_then([this, oc, child_pt, extent = std::move(extent), &key_range] (auto mresult) {
+ .si_then([this, oc, child_pt, extent = std::move(extent), &key_range, FNAME] (auto mresult) {
if (!key_range.total_complete && key_range.get_next) {
auto next_iter = child_pt + 1;
if (next_iter != iter_cend()) {
+ DEBUGT("move to next child for key range remove, this: {}", oc.t, *this);
key_range.first = (next_iter).get_key();
key_range.get_next = false;
} else {
- key_range.get_next = true;
- }
- if (get_meta().depth == key_range.root_depth && next_iter == iter_cend()) {
- key_range.total_complete = true;
+ if (get_meta().depth == key_range.root_depth) {
+ DEBUGT("key range remove complete at root level, this: {}", oc.t, *this);
+ key_range.total_complete = true;
+ } else {
+ DEBUGT("move to up level for key range remove, this: {}", oc.t, *this);
+ key_range.get_next = true;
+ }
}
}
+ DEBUGT("key range remove first={}, last={}, complete={}, get_next={}, this: {}", oc.t,
+ key_range.first, key_range.last, key_range.total_complete, key_range.get_next, *this);
switch (mresult.status) {
case mutation_status_t::SUCCESS:
case mutation_status_t::FAIL:
key_range_t &key_range)
{
LOG_PREFIX(OMapLeafNode::rm_key_range);
- DEBUGT("remove kyes: {}--{}, this: {}", oc.t, key_range.first, key_range.last, *this);
+ DEBUGT("remove kyes: {}--{}, {}-{} this: {}", oc.t, key_range.first, key_range.last,
+ key_range.total_complete, key_range.get_next, *this);
auto fiter = key_range.first.empty() ? iter_begin() : string_lower_bound(key_range.first); //include the first key
auto liter = key_range.last.empty() ? iter_end() : string_lower_bound(key_range.last); //not include the last key
*this);
if (fiter == iter_end() || fiter == liter) { //out of range or needn't remove anything
key_range.total_complete = true;
+ DEBUGT("no keys to remove, set complete = {}, this: {}", oc.t, key_range.total_complete, *this);
return rm_key_range_ret(
interruptible::ready_future_marker{},
mutation_result_t(mutation_status_t::FAIL, std::nullopt, std::nullopt));
auto mut = oc.tm.get_mutable_extent(oc.t, this)->cast<OMapLeafNode>();
return mut->rm_key_range(oc, key_range);
}
- auto dist = liter - fiter;
-
- (oc.t.get_omap_tree_stats().num_erases) += dist;
- journal_leaf_remove_range(fiter, liter, maybe_get_delta_buffer());
- if ((!key_range.last.empty() && liter != iter_end()) ||
- (get_meta().depth == key_range.root_depth && liter == iter_end())){
+ key_range.total_complete = false;
+ key_range.get_next = false;
+ if (liter == iter_end()) {
+ if (get_meta().depth == key_range.root_depth) {
+ DEBUGT("removed to the end, depth={}, root_depth={}", oc.t, get_meta().depth,
+ key_range.root_depth);
+ key_range.total_complete = true;
+ } else {
+ DEBUGT("removed to the end, depth={}, root_depth={}, set get_next=true", oc.t,
+ get_meta().depth, key_range.root_depth);
+ key_range.get_next = true;
+ key_range.first = "";
+ }
+ } else {
+ // liter != iter_end()
+ DEBUGT("removed up to key {}, set complete = false, this: {}", oc.t,
+ liter->get_key(), *this);
key_range.total_complete = true;
- } else if (liter == iter_end()) {
- key_range.get_next = true;
}
+ DEBUGT("key range remove complete={}, get_next={}, this: {}", oc.t,
+ key_range.total_complete, key_range.get_next, *this);
+
+ auto dist = liter - fiter;
+ (oc.t.get_omap_tree_stats().num_erases) += dist;
+ journal_leaf_remove_range(fiter, liter, maybe_get_delta_buffer());
if (extent_is_below_min()) {
return rm_key_range_ret(