}
};
-void PG::_delete_some(ObjectStore::Transaction *t)
+ghobject_t PG::_delete_some(ObjectStore::Transaction *t,
+ ghobject_t _next)
{
dout(10) << __func__ << dendl;
osd->sleep_timer.add_event_at(delete_schedule_time,
delete_requeue_callback);
dout(20) << __func__ << " Delete scheduled at " << delete_schedule_time << dendl;
- return;
+ return _next;
}
}
delete_needs_sleep = true;
+ ghobject_t next;
+
vector<ghobject_t> olist;
int max = std::min(osd->store->get_ideal_list_max(),
(int)cct->_conf->osd_target_transaction_size);
- ghobject_t next;
+
osd->store->collection_list(
ch,
- next,
+ _next,
ghobject_t::get_max(),
max,
&olist,
&next);
dout(20) << __func__ << " " << olist << dendl;
+ // make sure we've removed everything
+ // by one more listing from the beginning
+ if (_next != ghobject_t() && olist.empty()) {
+ next = ghobject_t();
+ osd->store->collection_list(
+ ch,
+ next,
+ ghobject_t::get_max(),
+ max,
+ &olist,
+ &next);
+ if (!olist.empty()) {
+ dout(0) << __func__ << " additional unexpected onode list"
+ <<" (new onodes has appeared since PG removal started"
+ << olist << dendl;
+ }
+ }
+
OSDriver::OSTransaction _t(osdriver.get_transaction(t));
int64_t num = 0;
for (auto& oid : olist) {
osd->logger->dec(l_osd_pg_removing);
}
}
+ return next;
}
// Compute pending backfill data
: my_base(ctx),
NamedState(context< RecoveryMachine >().pg, "Started/ToDelete/Deleting")
{
+ start = ceph::mono_clock::now();
+
context< RecoveryMachine >().log_enter(state_name);
+
PG *pg = context< RecoveryMachine >().pg;
pg->deleting = true;
ObjectStore::Transaction* t = context<RecoveryMachine>().get_cur_transaction();
const DeleteSome& evt)
{
PG *pg = context< RecoveryMachine >().pg;
- pg->_delete_some(context<RecoveryMachine>().get_cur_transaction());
+ next = pg->_delete_some(context<RecoveryMachine>().get_cur_transaction(),
+ next);
return discard_event();
}
PG *pg = context< RecoveryMachine >().pg;
pg->deleting = false;
pg->osd->local_reserver.cancel_reservation(pg->info.pgid);
+ ldout(pg->cct, 20) << "Deleting::" << __func__ << this <<" finished in "
+ << ceph::mono_clock::now() - start
+ << dendl;
}
/*--------GetInfo---------*/
virtual void on_removal(ObjectStore::Transaction *t) = 0;
- void _delete_some(ObjectStore::Transaction *t);
+ ghobject_t _delete_some(ObjectStore::Transaction *t,
+ ghobject_t _next);
virtual void set_dynamic_perf_stats_queries(
const std::list<OSDPerfMetricQuery> &queries) {
boost::statechart::custom_reaction< DeleteSome >,
boost::statechart::transition<DeleteInterrupted, WaitDeleteReserved>
> reactions;
+ ghobject_t next;
+ ceph::mono_clock::time_point start;
explicit Deleting(my_context ctx);
boost::statechart::result react(const DeleteSome &evt);
void exit();