]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/scrub: add a general data-carrying event type to the FSM
authorRonen Friedman <rfriedma@redhat.com>
Sun, 28 Jan 2024 07:25:38 +0000 (01:25 -0600)
committerRonen Friedman <rfriedma@redhat.com>
Tue, 30 Jan 2024 08:56:23 +0000 (02:56 -0600)
Based on Sam's Crimson FSM's 'value-event'.

Co-authored-by: Sam Just <sjust@redhat.com>
Signed-off-by: Ronen Friedman <rfriedma@redhat.com>
src/osd/scrubber/scrub_machine.h

index 9b2a800d18823abafcce3747fd272778bd37e03c..6eadb109cd54253b85e4a964b5f80d194ccd40ef 100644 (file)
@@ -102,6 +102,39 @@ OP_EV(ReplicaReserveReq);
 /// explicit release request from the Primary
 OP_EV(ReplicaRelease);
 
+template <typename T, has_formatter V>
+struct value_event_t : sc::event<T> {
+  const V value;
+
+  template <typename... Args>
+  value_event_t(Args&&... args) : value(std::forward<Args>(args)...)
+  {
+    on_event_creation(T::event_name);
+  }
+
+  value_event_t(const value_event_t&) = default;
+  value_event_t(value_event_t&&) = default;
+  value_event_t& operator=(const value_event_t&) = default;
+  value_event_t& operator=(value_event_t&&) = default;
+  ~value_event_t() { on_event_discard(T::event_name); }
+
+  template <typename FormatContext>
+  auto fmt_print_ctx(FormatContext& ctx) const
+  {
+    return fmt::format_to(ctx.out(), "{}({})", T::event_name, value);
+  }
+};
+
+#define VALUE_EVENT(T, V)                                          \
+  struct T : value_event_t<T, V> {                                 \
+    static constexpr const char* event_name = #T;                  \
+    template <typename... Args>                                    \
+    T(Args&&... args) : value_event_t(std::forward<Args>(args)...) \
+    {                                                              \
+    }                                                              \
+  };
+
+
 /// the async-reserver granted our reservation request
 OP_EV(ReserverGranted);