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()) {
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) {
+ key_range.total_complete = true;
+ } else {
+ 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:
*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));
(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())){
+ if (liter == iter_end()) {
+ if (get_meta().depth == key_range.root_depth) {
+ key_range.total_complete = true;
+ } else {
+ key_range.get_next = true;
+ key_range.first = "";
+ }
+ } else {
+ // liter != iter_end()
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);
if (extent_is_below_min()) {
return rm_key_range_ret(
interruptible::ready_future_marker{},