handle.exit();
});
+ /* TODO: add a way to expose progress via the optracker without misusing
+ * pipeline stages. https://tracker.ceph.com/issues/66473 */
ShardServices &shard_services = pg->get_shard_services();
co_await enter_stage<interruptor>(client_pp().wait_for_active);
snapid));
}
- co_await enter_stage<interruptor>(wait_subop);
-
logger().debug("{}: awaiting completion", *this);
co_await subop_blocker.interruptible_wait_completion();
}
if (needs_pause) {
- // let's know operators we're waiting
- co_await enter_stage<interruptor>(
- wait_trim_timer
- );
-
using crimson::common::local_conf;
const auto time_to_sleep =
local_conf().template get_val<double>("osd_snap_trim_sleep");
std::move(log_entries));
return submitted.then_interruptible(
[all_completed=std::move(all_completed), this] () mutable {
- return enter_stage<interruptor>(
- wait_repop
- ).then_interruptible([all_completed=std::move(all_completed)] () mutable {
- return std::move(all_completed);
- });
+ return std::move(all_completed);
});
});
});
SubOpBlocker<snap_trim_obj_subevent_ret_t> subop_blocker;
- // we don't need to synchronize with other instances of SnapTrimEvent;
- // it's here for the sake of op tracking.
- struct WaitSubop : OrderedConcurrentPhaseT<WaitSubop> {
- static constexpr auto type_name = "SnapTrimEvent::wait_subop";
- } wait_subop;
-
- // an instantiator can instruct us to go over this stage and then
- // wait for the future to implement throttling. It is implemented
- // that way to for the sake of tracking ops.
- struct WaitTrimTimer : OrderedExclusivePhaseT<WaitTrimTimer> {
- static constexpr auto type_name = "SnapTrimEvent::wait_trim_timer";
- } wait_trim_timer;
-
Ref<PG> pg;
PipelineHandle handle;
SnapMapper& snap_mapper;
PGActivationBlocker::BlockingEvent,
CommonPGPipeline::GetOBC::BlockingEvent,
CommonPGPipeline::Process::BlockingEvent,
- WaitSubop::BlockingEvent,
PG::BackgroundProcessLock::Wait::BlockingEvent,
- WaitTrimTimer::BlockingEvent,
CompletionEvent
> tracking_events;
remove_or_update_iertr::future<ceph::os::Transaction>
remove_or_update(ObjectContextRef obc, ObjectContextRef head_obc);
- // we don't need to synchronize with other instances started by
- // SnapTrimEvent; it's here for the sake of op tracking.
- struct WaitRepop : OrderedConcurrentPhaseT<WaitRepop> {
- static constexpr auto type_name = "SnapTrimObjSubEvent::wait_repop";
- } wait_repop;
-
void add_log_entry(
int _op,
const hobject_t& _soid,
PGActivationBlocker::BlockingEvent,
CommonPGPipeline::GetOBC::BlockingEvent,
CommonPGPipeline::Process::BlockingEvent,
- WaitRepop::BlockingEvent,
CompletionEvent
> tracking_events;
};