--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#pragma once
+
+#include "osd/osd_op_util.h"
+#include "crimson/osd/osd_operation.h"
+
+namespace crimson::osd {
+
+using interruptor =
+ ::crimson::interruptible::interruptor<
+ ::crimson::osd::IOInterruptCondition>;
+
+// bases on 998cb8c141bb89aafae298a9d5e130fbd78fe5f2
+template <typename T>
+struct SubOpBlocker : crimson::BlockerT<SubOpBlocker<T>> {
+ static constexpr const char* type_name = "CompoundOpBlocker";
+
+ using id_done_t = std::pair<crimson::OperationRef, T>;
+
+ void dump_detail(Formatter *f) const final {
+ f->open_array_section("dependent_operations");
+ {
+ for (const auto &kv : subops) {
+ f->dump_unsigned("op_id", kv.first->get_id());
+ }
+ }
+ f->close_section();
+ }
+
+ template <class... Args>
+ void emplace_back(Args&&... args) {
+ subops.emplace_back(std::forward<Args>(args)...);
+ };
+
+ T interruptible_wait_completion() {
+ return interruptor::do_for_each(subops, [](auto&& kv) {
+ return std::move(kv.second);
+ });
+ }
+
+ T wait_completion() {
+ return seastar::do_for_each(subops, [](auto&& kv) {
+ return std::move(kv.second);
+ });
+ }
+
+private:
+ std::vector<id_done_t> subops;
+};
+
+} // namespace crimson::osd
});
}
-void SnapTrimEvent::SubOpBlocker::dump_detail(Formatter *f) const
-{
- f->open_array_section("dependent_operations");
- {
- for (const auto &kv : subops) {
- f->dump_unsigned("op_id", kv.first->get_id());
- }
- }
- f->close_section();
-}
-
-template <class... Args>
-void SnapTrimEvent::SubOpBlocker::emplace_back(Args&&... args)
-{
- subops.emplace_back(std::forward<Args>(args)...);
-};
-
-SnapTrimEvent::remove_or_update_iertr::future<>
-SnapTrimEvent::SubOpBlocker::wait_completion()
-{
- return interruptor::do_for_each(subops, [](auto&& kv) {
- return std::move(kv.second);
- });
-}
-
void SnapTrimEvent::print(std::ostream &lhs) const
{
lhs << "SnapTrimEvent("
return enter_stage<interruptor>(wait_subop);
}).then_interruptible([this] {
logger().debug("{}: awaiting completion", *this);
- return subop_blocker.wait_completion();
+ return subop_blocker.interruptible_wait_completion();
}).finally([this] {
pg->background_process_lock.unlock();
}).si_then([this] {
#include "crimson/osd/osdmap_gate.h"
#include "crimson/osd/osd_operation.h"
+#include "crimson/common/subop_blocker.h"
#include "crimson/osd/osd_operations/common/pg_pipeline.h"
#include "crimson/osd/pg.h"
#include "crimson/osd/pg_activation_blocker.h"
private:
CommonPGPipeline& client_pp();
- // bases on 998cb8c141bb89aafae298a9d5e130fbd78fe5f2
- struct SubOpBlocker : crimson::BlockerT<SubOpBlocker> {
- static constexpr const char* type_name = "CompoundOpBlocker";
-
- using id_done_t = std::pair<crimson::OperationRef,
- remove_or_update_iertr::future<>>;
-
- void dump_detail(Formatter *f) const final;
-
- template <class... Args>
- void emplace_back(Args&&... args);
-
- remove_or_update_iertr::future<> wait_completion();
- private:
- std::vector<id_done_t> subops;
- } subop_blocker;
+ SubOpBlocker<remove_or_update_iertr::future<>> subop_blocker;
// we don't need to synchronize with other instances of SnapTrimEvent;
// it's here for the sake of op tracking.