}
}
+namespace crimson {
+ template <>
+ struct EventBackendRegistry<osd::SnapTrimEvent> {
+ static std::tuple<> get_backends() {
+ return {};
+ }
+ };
+}
+
namespace crimson::osd {
void SnapTrimEvent::print(std::ostream &lhs) const
seastar::future<> SnapTrimEvent::start()
{
- logger().debug("{}", __func__);
- return seastar::now();
+ logger().debug("{}: {}", *this, __func__);
+ return with_pg(
+ pg->get_shard_services(), pg
+ ).finally([ref=IRef{this}, this] {
+ logger().debug("{}: complete", *ref);
+ return handle.complete();
+ });
+}
+
+CommonPGPipeline& SnapTrimEvent::pp()
+{
+ return pg->request_pg_pipeline;
+}
+
+seastar::future<> SnapTrimEvent::with_pg(
+ ShardServices &shard_services, Ref<PG> _pg)
+{
+ return interruptor::with_interruption([&shard_services, this] {
+ return enter_stage<interruptor>(
+ pp().wait_for_active
+ ).then_interruptible([this] {
+ return with_blocking_event<PGActivationBlocker::BlockingEvent,
+ interruptor>([this] (auto&& trigger) {
+ return pg->wait_for_active_blocker.wait(std::move(trigger));
+ });
+ }).then_interruptible([this] {
+ return enter_stage<interruptor>(
+ pp().recover_missing);
+ }).then_interruptible([] {
+ //return do_recover_missing(pg, get_target_oid());
+ return seastar::now();
+ }).then_interruptible([this] {
+ return enter_stage<interruptor>(
+ pp().get_obc);
+ }).then_interruptible([this] {
+ return enter_stage<interruptor>(
+ pp().process);
+ }).then_interruptible([&shard_services, this] {
+ std::vector<hobject_t> to_trim;
+ assert(!to_trim.empty());
+ for (const auto& object : to_trim) {
+ logger().debug("{}: trimming {}", object);
+ // TODO: start subop and add to subop blcoker
+ }
+ return seastar::now();
+ });
+ }, [this](std::exception_ptr eptr) {
+ // TODO: better debug output
+ logger().debug("{}: interrupted {}", *this, eptr);
+ }, pg);
}
} // namespace crimson::osd
#include "crimson/osd/osdmap_gate.h"
#include "crimson/osd/osd_operation.h"
-#include "crimson/osd/osd_operations/background_recovery.h"
+#include "crimson/osd/osd_operations/common/pg_pipeline.h"
+#include "crimson/osd/pg.h"
+#include "crimson/osd/pg_activation_blocker.h"
#include "osd/osd_types.h"
#include "osd/PGPeeringEvent.h"
#include "osd/PeeringState.h"
ShardServices &shard_services, Ref<PG> pg);
private:
+ CommonPGPipeline& pp();
+
+ PipelineHandle handle;
Ref<PG> pg;
const snapid_t snapid;
+
+public:
+ PipelineHandle& get_handle() { return handle; }
+
+ std::tuple<
+ StartEvent,
+ CommonPGPipeline::WaitForActive::BlockingEvent,
+ PGActivationBlocker::BlockingEvent,
+ CommonPGPipeline::RecoverMissing::BlockingEvent,
+ CommonPGPipeline::GetOBC::BlockingEvent,
+ CommonPGPipeline::Process::BlockingEvent,
+ CompletionEvent
+ > tracking_events;
};
} // namespace crimson::osd