]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd, tools: migrate from boost::variant to std::variant 64101/head
authorKefu Chai <tchaikov@gmail.com>
Wed, 7 May 2025 00:42:52 +0000 (08:42 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 23 Jun 2025 07:47:43 +0000 (09:47 +0200)
Complete migration started in commit 017f333, replacing boost::variant with
std::variant throughout the librbd codebase. This change is part of our ongoing
effort to reduce third-party dependencies by leveraging C++ standard library
alternatives where possible.

Benefits include:
- Improved code readability and maintainability
- Reduced external dependency surface
- More consistent API usage with other components

Implementation note: Unlike Boost.variant, std::variant lacks built-in
operator<< support. This commit implements the necessary operator<< for
AttributeValue, our specific std::variant instantiation, to preserve the
existing behavior.

Also, despite that `apply_visit()` calls can be replaced with `visit()`
without being qualified with `std::` because of ADL, we are taking this
opportunity to adding the `std::` prefix for better readability.

Signed-off-by: Kefu Chai <tchaikov@gmail.com>
(cherry picked from commit 786ea203a28374d8d9bf0b8cc9c3c43dcf686328)

33 files changed:
src/librbd/MirroringWatcher.cc
src/librbd/TrashWatcher.cc
src/librbd/WatchNotifyTypes.h
src/librbd/api/Snapshot.cc
src/librbd/io/ImageDispatchSpec.cc
src/librbd/io/ObjectDispatchSpec.cc
src/librbd/io/ObjectDispatchSpec.h
src/librbd/io/ObjectDispatcher.cc
src/librbd/io/ReadResult.cc
src/librbd/io/ReadResult.h
src/librbd/journal/Replay.h
src/librbd/mirroring_watcher/Types.cc
src/librbd/mirroring_watcher/Types.h
src/librbd/trash_watcher/Types.cc
src/librbd/trash_watcher/Types.h
src/rbd_replay/ActionTypes.cc
src/rbd_replay/ActionTypes.h
src/rbd_replay/BoundedBuffer.hpp
src/rbd_replay/actions.cc
src/test/librbd/crypto/test_mock_CryptoObjectDispatch.cc
src/test/librbd/io/test_mock_ImageRequest.cc
src/test/librbd/operation/test_mock_TrimRequest.cc
src/tools/rbd_mirror/InstanceWatcher.cc
src/tools/rbd_mirror/LeaderWatcher.cc
src/tools/rbd_mirror/ServiceDaemon.cc
src/tools/rbd_mirror/image_map/Types.cc
src/tools/rbd_mirror/image_map/Types.h
src/tools/rbd_mirror/image_replayer/journal/EventPreprocessor.h
src/tools/rbd_mirror/instance_watcher/Types.cc
src/tools/rbd_mirror/instance_watcher/Types.h
src/tools/rbd_mirror/leader_watcher/Types.cc
src/tools/rbd_mirror/leader_watcher/Types.h
src/tools/rbd_mirror/service_daemon/Types.h

index c0cda5fa16a9f9d144db83d2049c435304ffe18f..dc08fa66b2aeda36362e7ac4789e64f21d180dd1 100644 (file)
@@ -108,8 +108,8 @@ void MirroringWatcher<I>::handle_notify(uint64_t notify_id, uint64_t handle,
     return;
   }
 
-  apply_visitor(watcher::util::HandlePayloadVisitor<MirroringWatcher<I>>(
-                  this, notify_id, handle), notify_message.payload);
+  std::visit(watcher::util::HandlePayloadVisitor<MirroringWatcher<I>>(
+      this, notify_id, handle), notify_message.payload);
 }
 
 template <typename I>
index 75d58820548584df7966f4006e494d8d78f5ecfc..021d5a9b2ae1a7ab3fd8a9b2731e07a687ea2f99 100644 (file)
@@ -83,7 +83,7 @@ void TrashWatcher<I>::handle_notify(uint64_t notify_id, uint64_t handle,
     return;
   }
 
-  apply_visitor(watcher::util::HandlePayloadVisitor<TrashWatcher<I>>(
+  std::visit(watcher::util::HandlePayloadVisitor<TrashWatcher<I>>(
     this, notify_id, handle), notify_message.payload);
 }
 
index 4fad31ffac93d87ebac883657fcf0339e7471e91..c2815b22cb921690f262beb15c46c7e2d80c20f6 100644 (file)
@@ -12,7 +12,6 @@
 #include <list>
 #include <memory>
 #include <string>
-#include <boost/variant.hpp>
 
 namespace ceph {
 class Formatter;
index 044237484a926ede0f12d1bf4760867ad786158b..2921a0857a842c4c0c4726055a97ec02d0e759a9 100644 (file)
@@ -13,8 +13,6 @@
 #include "include/Context.h"
 #include "common/Cond.h"
 
-#include <boost/variant.hpp>
-
 #include <shared_mutex> // for std::shared_lock
 
 #define dout_subsys ceph_subsys_rbd
index 95d8224ae904a790504cd5416f8259761319d149..81c4272a855478ecfa652831519bb93f406a8319 100644 (file)
@@ -6,7 +6,6 @@
 #include "librbd/io/AioCompletion.h"
 #include "librbd/io/ImageRequest.h"
 #include "librbd/io/ImageDispatcherInterface.h"
-#include <boost/variant.hpp>
 
 namespace librbd {
 namespace io {
index 3efff9774f087cf88427aa3bb477d316c47f1ef4..52066f127f882097260520fadad1601c02b0918a 100644 (file)
@@ -4,7 +4,6 @@
 #include "librbd/io/ObjectDispatchSpec.h"
 #include "include/Context.h"
 #include "librbd/io/ObjectDispatcherInterface.h"
-#include <boost/variant.hpp>
 
 namespace librbd {
 namespace io {
index a0d4b49a46345c84134e86d21a91e1b33b1fbe4f..9a9c6aabdf644f3da68f5a8d01dda0b7369801cb 100644 (file)
@@ -11,7 +11,7 @@
 #include "common/zipkin_trace.h"
 #include "librbd/Types.h"
 #include "librbd/io/Types.h"
-#include <boost/variant/variant.hpp>
+#include <variant>
 
 namespace librbd {
 namespace io {
@@ -144,13 +144,13 @@ public:
     }
   };
 
-  typedef boost::variant<ReadRequest,
-                         DiscardRequest,
-                         WriteRequest,
-                         WriteSameRequest,
-                         CompareAndWriteRequest,
-                         FlushRequest,
-                         ListSnapsRequest> Request;
+  typedef std::variant<ReadRequest,
+                      DiscardRequest,
+                      WriteRequest,
+                      WriteSameRequest,
+                      CompareAndWriteRequest,
+                      FlushRequest,
+                      ListSnapsRequest> Request;
 
   C_Dispatcher dispatcher_ctx;
 
index 5852fd925926eeb7126e08b07dc4f85b554fe74d..17780e16c22b13f1755a6e2b322c762748a38bbf 100644 (file)
@@ -10,7 +10,6 @@
 #include "librbd/asio/ContextWQ.h"
 #include "librbd/io/ObjectDispatch.h"
 #include "librbd/io/ObjectDispatchSpec.h"
-#include <boost/variant.hpp>
 
 #include <shared_mutex> // for std::shared_lock
 
@@ -35,7 +34,7 @@ struct ObjectDispatcher<I>::C_ResetExistenceCache : public C_LayerIterator {
 };
 
 template <typename I>
-struct ObjectDispatcher<I>::SendVisitor : public boost::static_visitor<bool> {
+struct ObjectDispatcher<I>::SendVisitor {
   ObjectDispatchInterface* object_dispatch;
   ObjectDispatchSpec* object_dispatch_spec;
 
@@ -199,7 +198,7 @@ template <typename I>
 bool ObjectDispatcher<I>::send_dispatch(
     ObjectDispatchInterface* object_dispatch,
     ObjectDispatchSpec* object_dispatch_spec) {
-  return boost::apply_visitor(
+  return std::visit(
     SendVisitor{object_dispatch, object_dispatch_spec},
     object_dispatch_spec->request);
 }
index 375c34277b00cc20d3e423abc766af632c9846bd..1da8f6af9c7891297bbc015ae728f39cdcb710f1 100644 (file)
@@ -6,8 +6,6 @@
 #include "common/dout.h"
 #include "librbd/io/AioCompletion.h"
 #include "librbd/io/Utils.h"
-#include <boost/variant/apply_visitor.hpp>
-#include <boost/variant/static_visitor.hpp>
 
 #define dout_subsys ceph_subsys_rbd
 #undef dout_prefix
@@ -17,7 +15,7 @@
 namespace librbd {
 namespace io {
 
-struct ReadResult::SetImageExtentsVisitor : public boost::static_visitor<void> {
+struct ReadResult::SetImageExtentsVisitor {
   Extents image_extents;
 
   explicit SetImageExtentsVisitor(const Extents& image_extents)
@@ -40,7 +38,7 @@ struct ReadResult::SetImageExtentsVisitor : public boost::static_visitor<void> {
   }
 };
 
-struct ReadResult::AssembleResultVisitor : public boost::static_visitor<void> {
+struct ReadResult::AssembleResultVisitor {
   CephContext *cct;
   Striper::StripedReadResult &destriper;
 
@@ -48,7 +46,7 @@ struct ReadResult::AssembleResultVisitor : public boost::static_visitor<void> {
     : cct(cct), destriper(destriper) {
   }
 
-  void operator()(Empty &empty) const {
+  void operator()(std::monostate &empty) const {
     ldout(cct, 20) << "dropping read result" << dendl;
   }
 
@@ -230,9 +228,6 @@ void ReadResult::C_ObjectReadMergedExtents::finish(int r) {
   on_finish->complete(r);
 }
 
-ReadResult::ReadResult() : m_buffer(Empty()) {
-}
-
 ReadResult::ReadResult(char *buf, size_t buf_len)
   : m_buffer(Linear(buf, buf_len)) {
 }
@@ -250,11 +245,11 @@ ReadResult::ReadResult(Extents* extent_map, ceph::bufferlist* bl)
 }
 
 void ReadResult::set_image_extents(const Extents& image_extents) {
-  boost::apply_visitor(SetImageExtentsVisitor(image_extents), m_buffer);
+  std::visit(SetImageExtentsVisitor(image_extents), m_buffer);
 }
 
 void ReadResult::assemble_result(CephContext *cct) {
-  boost::apply_visitor(AssembleResultVisitor(cct, m_destriper), m_buffer);
+  std::visit(AssembleResultVisitor(cct, m_destriper), m_buffer);
 }
 
 } // namespace io
index 11b8c9b72cb010f51a44aeffbfa99e90652f5222..8e644fb1f96c56a551012a040557c1cc43baefb5 100644 (file)
@@ -11,7 +11,7 @@
 #include "librbd/io/Types.h"
 #include "osdc/Striper.h"
 #include <sys/uio.h>
-#include <boost/variant/variant.hpp>
+#include <variant>
 
 
 namespace librbd {
@@ -60,7 +60,7 @@ public:
       void finish(int r) override;
   };
 
-  ReadResult();
+  ReadResult() = default;
   ReadResult(char *buf, size_t buf_len);
   ReadResult(const struct iovec *iov, int iov_count);
   ReadResult(ceph::bufferlist *bl);
@@ -71,9 +71,6 @@ public:
   void assemble_result(CephContext *cct);
 
 private:
-  struct Empty {
-  };
-
   struct Linear {
     char *buf;
     size_t buf_len;
@@ -109,11 +106,11 @@ private:
     }
   };
 
-  typedef boost::variant<Empty,
-                         Linear,
-                         Vector,
-                         Bufferlist,
-                         SparseBufferlist> Buffer;
+  typedef std::variant<std::monostate,
+                      Linear,
+                      Vector,
+                      Bufferlist,
+                      SparseBufferlist> Buffer;
   struct SetImageExtentsVisitor;
   struct AssembleResultVisitor;
 
index 038601833cd97120f7acb91bcc86167e88d7c3d4..f07880d31013780282487040b9f04247a1d30c87 100644 (file)
@@ -10,7 +10,6 @@
 #include "common/ceph_mutex.h"
 #include "librbd/io/Types.h"
 #include "librbd/journal/Types.h"
-#include <boost/variant.hpp>
 #include <list>
 #include <unordered_set>
 #include <unordered_map>
@@ -102,7 +101,7 @@ private:
     }
   };
 
-  struct EventVisitor : public boost::static_visitor<void> {
+  struct EventVisitor {
     Replay *replay;
     Context *on_ready;
     Context *on_safe;
index 3226b6352f79eb4048c7d676ee5086976fe7f32e..916c62b2c835b33af2dbf61a9eeab57fc73900d5 100644 (file)
@@ -12,7 +12,7 @@ namespace mirroring_watcher {
 
 namespace {
 
-class DumpPayloadVisitor : public boost::static_visitor<void> {
+class DumpPayloadVisitor {
 public:
   explicit DumpPayloadVisitor(Formatter *formatter) : m_formatter(formatter) {}
 
@@ -80,7 +80,7 @@ void UnknownPayload::dump(Formatter *f) const {
 
 void NotifyMessage::encode(bufferlist& bl) const {
   ENCODE_START(1, 1, bl);
-  boost::apply_visitor(watcher::util::EncodePayloadVisitor(bl), payload);
+  std::visit(watcher::util::EncodePayloadVisitor(bl), payload);
   ENCODE_FINISH(bl);
 }
 
@@ -103,12 +103,12 @@ void NotifyMessage::decode(bufferlist::const_iterator& iter) {
     break;
   }
 
-  apply_visitor(watcher::util::DecodePayloadVisitor(struct_v, iter), payload);
+  std::visit(watcher::util::DecodePayloadVisitor(struct_v, iter), payload);
   DECODE_FINISH(iter);
 }
 
 void NotifyMessage::dump(Formatter *f) const {
-  apply_visitor(DumpPayloadVisitor(f), payload);
+  std::visit(DumpPayloadVisitor(f), payload);
 }
 
 void NotifyMessage::generate_test_instances(std::list<NotifyMessage *> &o) {
index 1e096a9d384c12310b57b0b52065618919550f86..784151a6808d22d33fa88cf2f7b393a7a4e51d36 100644 (file)
@@ -11,7 +11,7 @@
 #include <iosfwd>
 #include <list>
 #include <string>
-#include <boost/variant.hpp>
+#include <variant>
 
 namespace ceph { class Formatter; }
 
@@ -72,9 +72,9 @@ struct UnknownPayload {
   void dump(Formatter *f) const;
 };
 
-typedef boost::variant<ModeUpdatedPayload,
-                       ImageUpdatedPayload,
-                       UnknownPayload> Payload;
+typedef std::variant<ModeUpdatedPayload,
+                    ImageUpdatedPayload,
+                    UnknownPayload> Payload;
 
 struct NotifyMessage {
   NotifyMessage(const Payload &payload = UnknownPayload()) : payload(payload) {
index c95ea223b936e0c18028b61fba80b998afcfe160..409d518972ea48671672de9773ba895fc23abacb 100644 (file)
@@ -12,7 +12,7 @@ namespace trash_watcher {
 
 namespace {
 
-class DumpPayloadVisitor : public boost::static_visitor<void> {
+class DumpPayloadVisitor {
 public:
   explicit DumpPayloadVisitor(Formatter *formatter) : m_formatter(formatter) {}
 
@@ -74,7 +74,7 @@ void UnknownPayload::dump(Formatter *f) const {
 
 void NotifyMessage::encode(bufferlist& bl) const {
   ENCODE_START(1, 1, bl);
-  boost::apply_visitor(watcher::util::EncodePayloadVisitor(bl), payload);
+  std::visit(watcher::util::EncodePayloadVisitor(bl), payload);
   ENCODE_FINISH(bl);
 }
 
@@ -97,12 +97,12 @@ void NotifyMessage::decode(bufferlist::const_iterator& iter) {
     break;
   }
 
-  apply_visitor(watcher::util::DecodePayloadVisitor(struct_v, iter), payload);
+  std::visit(watcher::util::DecodePayloadVisitor(struct_v, iter), payload);
   DECODE_FINISH(iter);
 }
 
 void NotifyMessage::dump(Formatter *f) const {
-  apply_visitor(DumpPayloadVisitor(f), payload);
+  std::visit(DumpPayloadVisitor(f), payload);
 }
 
 void NotifyMessage::generate_test_instances(std::list<NotifyMessage *> &o) {
index 22c2b4375dcaaf6002d2fdf43ecefcf37f4505e4..ea5dad9b3be52f6001ac0ab60005024b01ec8140 100644 (file)
@@ -11,7 +11,7 @@
 #include <iosfwd>
 #include <list>
 #include <string>
-#include <boost/variant.hpp>
+#include <variant>
 
 
 namespace librbd {
@@ -67,9 +67,9 @@ struct UnknownPayload {
   void dump(Formatter *f) const;
 };
 
-typedef boost::variant<ImageAddedPayload,
-                       ImageRemovedPayload,
-                       UnknownPayload> Payload;
+typedef std::variant<ImageAddedPayload,
+                    ImageRemovedPayload,
+                    UnknownPayload> Payload;
 
 struct NotifyMessage {
   NotifyMessage(const Payload &payload = UnknownPayload()) : payload(payload) {
index e86aa6479c2d42beaea6bddd5736ef692e36e829..8a93672f3c7d8993c9f80e5f2c336423af37dc6b 100644 (file)
@@ -7,7 +7,6 @@
 #include "include/stringify.h"
 #include "common/Formatter.h"
 #include <iostream>
-#include <boost/variant.hpp>
 
 namespace rbd_replay {
 namespace action {
@@ -35,7 +34,7 @@ void decode_big_endian_string(std::string &str, bufferlist::const_iterator &it)
 #endif
 }
 
-class EncodeVisitor : public boost::static_visitor<void> {
+class EncodeVisitor {
 public:
   explicit EncodeVisitor(bufferlist &bl) : m_bl(bl) {
   }
@@ -50,7 +49,7 @@ private:
   bufferlist &m_bl;
 };
 
-class DecodeVisitor : public boost::static_visitor<void> {
+class DecodeVisitor {
 public:
   DecodeVisitor(__u8 version, bufferlist::const_iterator &iter)
     : m_version(version), m_iter(iter) {
@@ -65,7 +64,7 @@ private:
   bufferlist::const_iterator &m_iter;
 };
 
-class DumpVisitor : public boost::static_visitor<void> {
+class DumpVisitor {
 public:
   explicit DumpVisitor(Formatter *formatter) : m_formatter(formatter) {}
 
@@ -270,7 +269,7 @@ void UnknownAction::dump(Formatter *f) const {
 
 void ActionEntry::encode(bufferlist &bl) const {
   ENCODE_START(1, 1, bl);
-  boost::apply_visitor(EncodeVisitor(bl), action);
+  std::visit(EncodeVisitor(bl), action);
   ENCODE_FINISH(bl);
 }
 
@@ -329,11 +328,11 @@ void ActionEntry::decode_versioned(__u8 version, bufferlist::const_iterator &it)
     break;
   }
 
-  boost::apply_visitor(DecodeVisitor(version, it), action);
+  std::visit(DecodeVisitor(version, it), action);
 }
 
 void ActionEntry::dump(Formatter *f) const {
-  boost::apply_visitor(DumpVisitor(f), action);
+  std::visit(DumpVisitor(f), action);
 }
 
 void ActionEntry::generate_test_instances(std::list<ActionEntry *> &o) {
index 19e1bb8fabfef3131b377b2c71dfcf9d08ec8634..0d7511cc444a0f8887ed409c920f17a91979d8b4 100644 (file)
@@ -11,7 +11,7 @@
 #include <list>
 #include <string>
 #include <vector>
-#include <boost/variant/variant.hpp>
+#include <variant>
 
 namespace ceph { class Formatter; }
 
@@ -294,19 +294,19 @@ struct UnknownAction {
   void dump(Formatter *f) const;
 };
 
-typedef boost::variant<StartThreadAction,
-                       StopThreadAction,
-                       ReadAction,
-                       WriteAction,
-                       DiscardAction,
-                       AioReadAction,
-                       AioWriteAction,
-                       AioDiscardAction,
-                       OpenImageAction,
-                       CloseImageAction,
-                       AioOpenImageAction,
-                       AioCloseImageAction,
-                       UnknownAction> Action;
+typedef std::variant<StartThreadAction,
+                    StopThreadAction,
+                    ReadAction,
+                    WriteAction,
+                    DiscardAction,
+                    AioReadAction,
+                    AioWriteAction,
+                    AioDiscardAction,
+                    OpenImageAction,
+                    CloseImageAction,
+                    AioOpenImageAction,
+                    AioCloseImageAction,
+                    UnknownAction> Action;
 
 class ActionEntry {
 public:
index 00fb1cb32344dfe7520c176b6e1153f0ec2a6aac..6185d26663e17b88d3cf3ee24272b63b21be2107 100644 (file)
@@ -5,6 +5,7 @@
 #define _INCLUDED_BOUNDED_BUFFER_HPP
 
 #include <boost/bind/bind.hpp>
+#include <boost/call_traits.hpp>
 #include <boost/circular_buffer.hpp>
 #include <boost/thread/condition.hpp>
 #include <boost/thread/mutex.hpp>
index 8aae77c09651b18bd742480633e1b07e4eb137c3..e67911bc6dc9d8f8f8205d5a301565fc3a387419 100644 (file)
@@ -33,7 +33,7 @@ std::string create_fake_data() {
   return std::string(data, sizeof(data));
 }
 
-struct ConstructVisitor : public boost::static_visitor<Action::ptr> {
+struct ConstructVisitor {
   inline Action::ptr operator()(const action::StartThreadAction &action) const {
     return Action::ptr(new StartThreadAction(action));
   }
@@ -94,7 +94,7 @@ std::ostream& rbd_replay::operator<<(std::ostream& o, const Action& a) {
 }
 
 Action::ptr Action::construct(const action::ActionEntry &action_entry) {
-  return boost::apply_visitor(ConstructVisitor(), action_entry.action);
+  return std::visit(ConstructVisitor(), action_entry.action);
 }
 
 void StartThreadAction::perform(ActionCtx &ctx) {
index 0c69f3f1d5d2c0ffffa358cbc21b6476b7f1ddb4..3c4ce8f8f940ca08117cb16acb56828b194027d5 100644 (file)
@@ -157,7 +157,7 @@ struct TestMockCryptoCryptoObjectDispatch : public TestMockFixture {
     EXPECT_CALL(*mock_image_ctx->io_object_dispatcher, send(_))
             .WillOnce(Invoke([this, extents,
                               version](io::ObjectDispatchSpec* spec) {
-                auto* read = boost::get<io::ObjectDispatchSpec::ReadRequest>(
+                auto* read = std::get_if<io::ObjectDispatchSpec::ReadRequest>(
                         &spec->request);
                 ASSERT_TRUE(read != nullptr);
 
@@ -193,7 +193,7 @@ struct TestMockCryptoCryptoObjectDispatch : public TestMockFixture {
     EXPECT_CALL(*mock_image_ctx->io_object_dispatcher, send(_))
             .WillOnce(Invoke([this, object_off, data, write_flags,
                               assert_version](io::ObjectDispatchSpec* spec) {
-                auto* write = boost::get<io::ObjectDispatchSpec::WriteRequest>(
+                auto* write = std::get_if<io::ObjectDispatchSpec::WriteRequest>(
                         &spec->request);
                 ASSERT_TRUE(write != nullptr);
 
@@ -210,7 +210,7 @@ struct TestMockCryptoCryptoObjectDispatch : public TestMockFixture {
   void expect_object_write_same() {
     EXPECT_CALL(*mock_image_ctx->io_object_dispatcher, send(_))
             .WillOnce(Invoke([this](io::ObjectDispatchSpec* spec) {
-                auto* write_same = boost::get<
+                auto* write_same = std::get_if<
                         io::ObjectDispatchSpec::WriteSameRequest>(
                                 &spec->request);
                 ASSERT_TRUE(write_same != nullptr);
index b68009304d55d3c8ab2192c051ba6dd1bae469af..9c31f49666217be733eff7c16f9f7e81185d02f2 100644 (file)
@@ -137,7 +137,7 @@ struct TestMockIoImageRequest : public TestMockFixture {
     EXPECT_CALL(*mock_image_ctx.io_object_dispatcher, send(_))
       .WillOnce(Invoke([&mock_image_ctx, object_no, offset, length, r]
                 (ObjectDispatchSpec* spec) {
-                  auto* discard_spec = boost::get<ObjectDispatchSpec::DiscardRequest>(&spec->request);
+                  auto* discard_spec = std::get_if<ObjectDispatchSpec::DiscardRequest>(&spec->request);
                   ASSERT_TRUE(discard_spec != nullptr);
                   ASSERT_EQ(object_no, discard_spec->object_no);
                   ASSERT_EQ(offset, discard_spec->object_off);
@@ -165,7 +165,7 @@ struct TestMockIoImageRequest : public TestMockFixture {
       .WillOnce(
         Invoke([&mock_image_ctx, object_no, snap_delta, r]
                (ObjectDispatchSpec* spec) {
-                  auto request = boost::get<
+                  auto request = std::get_if<
                     librbd::io::ObjectDispatchSpec::ListSnapsRequest>(
                       &spec->request);
                   ASSERT_TRUE(request != nullptr);
index aebd2117daeeaba9110349701c33a2011096adce..72e5f2397da18cc306607481d95a426d6b5eb764 100644 (file)
@@ -14,7 +14,6 @@
 #include "librbd/operation/TrimRequest.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include <boost/variant.hpp>
 
 #include <shared_mutex> // for std::shared_lock
 
@@ -69,8 +68,7 @@ struct AsyncRequest<librbd::MockTestImageCtx> {
 
 namespace io {
 
-struct DiscardVisitor
-  : public boost::static_visitor<ObjectDispatchSpec::DiscardRequest*> {
+struct DiscardVisitor {
   ObjectDispatchSpec::DiscardRequest*
   operator()(ObjectDispatchSpec::DiscardRequest& discard) const {
     return &discard;
@@ -196,7 +194,7 @@ public:
     EXPECT_CALL(*mock_image_ctx.io_object_dispatcher, send(_))
       .WillOnce(Invoke([&mock_image_ctx, offset, length, update_object_map, r]
                        (io::ObjectDispatchSpec* spec) {
-                  auto discard = boost::apply_visitor(io::DiscardVisitor(), spec->request);
+                  auto discard = std::visit(io::DiscardVisitor(), spec->request);
                   ASSERT_TRUE(discard != nullptr);
                   ASSERT_EQ(offset, discard->object_off);
                   ASSERT_EQ(length, discard->object_len);
index 7b531064ded525e6fd01e3866f273d03e0a5c7b9..2246442d5b3782c615e694170b89e60dd537ffbd 100644 (file)
@@ -1093,8 +1093,8 @@ void InstanceWatcher<I>::handle_notify(uint64_t notify_id, uint64_t handle,
     return;
   }
 
-  apply_visitor(HandlePayloadVisitor(this, stringify(notifier_id), ctx),
-                notify_message.payload);
+  std::visit(HandlePayloadVisitor(this, stringify(notifier_id), ctx),
+            notify_message.payload);
 }
 
 template <typename I>
index 8f12af14c8cef1eaa441d2c54c74293728fc2c20..f1aecc67e0a3a392cc6525b7e976d404daefbd20 100644 (file)
@@ -1015,7 +1015,7 @@ void LeaderWatcher<I>::handle_notify(uint64_t notify_id, uint64_t handle,
     return;
   }
 
-  apply_visitor(HandlePayloadVisitor(this, ctx), notify_message.payload);
+  std::visit(HandlePayloadVisitor(this, ctx), notify_message.payload);
 }
 
 template <typename I>
index 2276c2ec571992a45f62255fe7bf755fa013b7f7..203be5f613412d91ac5fa0395b427638f654022b 100644 (file)
@@ -26,7 +26,7 @@ namespace {
 
 const std::string RBD_MIRROR_AUTH_ID_PREFIX("rbd-mirror.");
 
-struct AttributeDumpVisitor : public boost::static_visitor<void> {
+struct AttributeDumpVisitor {
   ceph::Formatter *f;
   const std::string& name;
 
@@ -184,6 +184,13 @@ void ServiceDaemon<I>::remove_callout(int64_t pool_id, uint64_t callout_id) {
   schedule_update_status();
 }
 
+std::ostream& operator<<(std::ostream& out, const AttributeValue& value) {
+  std::visit([&out](const auto& v) {
+    out << v;
+  }, value);
+  return out;
+}
+
 template <typename I>
 void ServiceDaemon<I>::add_or_update_attribute(int64_t pool_id,
                                                const std::string& key,
@@ -287,7 +294,7 @@ void ServiceDaemon<I>::update_status() {
 
       for (auto& attribute : pool_pair.second.attributes) {
         AttributeDumpVisitor attribute_dump_visitor(&f, attribute.first);
-        boost::apply_visitor(attribute_dump_visitor, attribute.second);
+        std::visit(attribute_dump_visitor, attribute.second);
       }
 
       f.open_object_section("namespaces");
@@ -295,7 +302,7 @@ void ServiceDaemon<I>::update_status() {
         f.open_object_section(ns.c_str());
         for (auto& [key, value] : attributes) {
           AttributeDumpVisitor attribute_dump_visitor(&f, key);
-          boost::apply_visitor(attribute_dump_visitor, value);
+          std::visit(attribute_dump_visitor, value);
         }
         f.close_section(); // namespace
       }
index 47de9c3cf590bf2348da407b9f09fccfc1f71e0f..4f5ae6c4966155f18d5f28546ac28655cb987b62 100644 (file)
@@ -16,7 +16,7 @@ const std::string UNMAPPED_INSTANCE_ID("");
 namespace {
 
 template <typename E>
-class GetTypeVisitor : public boost::static_visitor<E> {
+class GetTypeVisitor {
 public:
   template <typename T>
   inline E operator()(const T&) const {
@@ -24,7 +24,7 @@ public:
   }
 };
 
-class EncodeVisitor : public boost::static_visitor<void> {
+class EncodeVisitor {
 public:
   explicit EncodeVisitor(bufferlist &bl) : m_bl(bl) {
   }
@@ -39,7 +39,7 @@ private:
   bufferlist &m_bl;
 };
 
-class DecodeVisitor : public boost::static_visitor<void> {
+class DecodeVisitor {
 public:
   DecodeVisitor(__u8 version, bufferlist::const_iterator &iter)
     : m_version(version), m_iter(iter) {
@@ -54,7 +54,7 @@ private:
   bufferlist::const_iterator &m_iter;
 };
 
-class DumpVisitor : public boost::static_visitor<void> {
+class DumpVisitor {
 public:
   explicit DumpVisitor(Formatter *formatter, const std::string &key)
     : m_formatter(formatter), m_key(key) {}
@@ -73,12 +73,12 @@ private:
 } // anonymous namespace
 
 PolicyMetaType PolicyData::get_policy_meta_type() const {
-  return boost::apply_visitor(GetTypeVisitor<PolicyMetaType>(), policy_meta);
+  return std::visit(GetTypeVisitor<PolicyMetaType>(), policy_meta);
 }
 
 void PolicyData::encode(bufferlist& bl) const {
   ENCODE_START(1, 1, bl);
-  boost::apply_visitor(EncodeVisitor(bl), policy_meta);
+  std::visit(EncodeVisitor(bl), policy_meta);
   ENCODE_FINISH(bl);
 }
 
@@ -97,12 +97,12 @@ void PolicyData::decode(bufferlist::const_iterator& it) {
     break;
   }
 
-  boost::apply_visitor(DecodeVisitor(struct_v, it), policy_meta);
+  std::visit(DecodeVisitor(struct_v, it), policy_meta);
   DECODE_FINISH(it);
 }
 
 void PolicyData::dump(Formatter *f) const {
-  boost::apply_visitor(DumpVisitor(f, "policy_meta_type"), policy_meta);
+  std::visit(DumpVisitor(f, "policy_meta_type"), policy_meta);
 }
 
 void PolicyData::generate_test_instances(std::list<PolicyData *> &o) {
index 5a97430f3b630d738bfa696344e797c8defde0be..07908dfc7dcab22d755c7bdd81bec3c315437ad1 100644 (file)
@@ -8,7 +8,7 @@
 #include <map>
 #include <set>
 #include <string>
-#include <boost/variant.hpp>
+#include <variant>
 
 #include "include/buffer.h"
 #include "include/encoding.h"
@@ -97,8 +97,8 @@ struct PolicyMetaUnknown {
   }
 };
 
-typedef boost::variant<PolicyMetaNone,
-                       PolicyMetaUnknown> PolicyMeta;
+typedef std::variant<PolicyMetaNone,
+                    PolicyMetaUnknown> PolicyMeta;
 
 struct PolicyData {
   PolicyData()
index 12f70eb9350a319d1a2b703d59377ea0f22d0042..82c78808553f09646f97757b9a342671d5e2a12d 100644 (file)
@@ -9,7 +9,6 @@
 #include "librbd/journal/TypeTraits.h"
 #include <map>
 #include <string>
-#include <boost/variant/static_visitor.hpp>
 
 struct Context;
 namespace journal { class Journaler; }
@@ -72,7 +71,7 @@ private:
 
   typedef std::map<uint64_t, uint64_t> SnapSeqs;
 
-  class PreprocessEventVisitor : public boost::static_visitor<int> {
+  class PreprocessEventVisitor {
   public:
     EventPreprocessor *event_preprocessor;
 
index 225cd74073363ef9c62f7b0f831e9a6b1c566f01..4c9f5235f1927fc55c8c0421b65d29737517cfef 100644 (file)
@@ -12,7 +12,7 @@ namespace instance_watcher {
 
 namespace {
 
-class EncodePayloadVisitor : public boost::static_visitor<void> {
+class EncodePayloadVisitor {
 public:
   explicit EncodePayloadVisitor(bufferlist &bl) : m_bl(bl) {}
 
@@ -27,7 +27,7 @@ private:
   bufferlist &m_bl;
 };
 
-class DecodePayloadVisitor : public boost::static_visitor<void> {
+class DecodePayloadVisitor {
 public:
   DecodePayloadVisitor(__u8 version, bufferlist::const_iterator &iter)
     : m_version(version), m_iter(iter) {}
@@ -42,7 +42,7 @@ private:
   bufferlist::const_iterator &m_iter;
 };
 
-class DumpPayloadVisitor : public boost::static_visitor<void> {
+class DumpPayloadVisitor {
 public:
   explicit DumpPayloadVisitor(Formatter *formatter) : m_formatter(formatter) {}
 
@@ -139,7 +139,7 @@ void UnknownPayload::dump(Formatter *f) const {
 
 void NotifyMessage::encode(bufferlist& bl) const {
   ENCODE_START(2, 2, bl);
-  boost::apply_visitor(EncodePayloadVisitor(bl), payload);
+  std::visit(EncodePayloadVisitor(bl), payload);
   ENCODE_FINISH(bl);
 }
 
@@ -171,12 +171,12 @@ void NotifyMessage::decode(bufferlist::const_iterator& iter) {
     break;
   }
 
-  apply_visitor(DecodePayloadVisitor(struct_v, iter), payload);
+  std::visit(DecodePayloadVisitor(struct_v, iter), payload);
   DECODE_FINISH(iter);
 }
 
 void NotifyMessage::dump(Formatter *f) const {
-  apply_visitor(DumpPayloadVisitor(f), payload);
+  std::visit(DumpPayloadVisitor(f), payload);
 }
 
 void NotifyMessage::generate_test_instances(std::list<NotifyMessage *> &o) {
index b0b7b77910eb557251c0023504f291c11fa55dd2..b9e0d19bca78c8858bee9d63e60baac111c3165b 100644 (file)
@@ -6,7 +6,7 @@
 
 #include <string>
 #include <set>
-#include <boost/variant.hpp>
+#include <variant>
 
 #include "include/buffer_fwd.h"
 #include "include/encoding.h"
@@ -143,12 +143,12 @@ struct UnknownPayload {
   void dump(Formatter *f) const;
 };
 
-typedef boost::variant<ImageAcquirePayload,
-                       ImageReleasePayload,
-                       PeerImageRemovedPayload,
-                       SyncRequestPayload,
-                       SyncStartPayload,
-                       UnknownPayload> Payload;
+typedef std::variant<ImageAcquirePayload,
+                    ImageReleasePayload,
+                    PeerImageRemovedPayload,
+                    SyncRequestPayload,
+                    SyncStartPayload,
+                    UnknownPayload> Payload;
 
 struct NotifyMessage {
   NotifyMessage(const Payload &payload = UnknownPayload()) : payload(payload) {
index d2fb7908fa4b531c96d29d1c32b7433235d56e93..ae77c6b3501b8122b30afd6462cf232217e1fc69 100644 (file)
@@ -12,7 +12,7 @@ namespace leader_watcher {
 
 namespace {
 
-class EncodePayloadVisitor : public boost::static_visitor<void> {
+class EncodePayloadVisitor {
 public:
   explicit EncodePayloadVisitor(bufferlist &bl) : m_bl(bl) {}
 
@@ -27,7 +27,7 @@ private:
   bufferlist &m_bl;
 };
 
-class DecodePayloadVisitor : public boost::static_visitor<void> {
+class DecodePayloadVisitor {
 public:
   DecodePayloadVisitor(__u8 version, bufferlist::const_iterator &iter)
     : m_version(version), m_iter(iter) {}
@@ -42,7 +42,7 @@ private:
   bufferlist::const_iterator &m_iter;
 };
 
-class DumpPayloadVisitor : public boost::static_visitor<void> {
+class DumpPayloadVisitor {
 public:
   explicit DumpPayloadVisitor(Formatter *formatter) : m_formatter(formatter) {}
 
@@ -98,7 +98,7 @@ void UnknownPayload::dump(Formatter *f) const {
 
 void NotifyMessage::encode(bufferlist& bl) const {
   ENCODE_START(1, 1, bl);
-  boost::apply_visitor(EncodePayloadVisitor(bl), payload);
+  std::visit(EncodePayloadVisitor(bl), payload);
   ENCODE_FINISH(bl);
 }
 
@@ -124,12 +124,12 @@ void NotifyMessage::decode(bufferlist::const_iterator& iter) {
     break;
   }
 
-  apply_visitor(DecodePayloadVisitor(struct_v, iter), payload);
+  std::visit(DecodePayloadVisitor(struct_v, iter), payload);
   DECODE_FINISH(iter);
 }
 
 void NotifyMessage::dump(Formatter *f) const {
-  apply_visitor(DumpPayloadVisitor(f), payload);
+  std::visit(DumpPayloadVisitor(f), payload);
 }
 
 void NotifyMessage::generate_test_instances(std::list<NotifyMessage *> &o) {
index 1278e54b77cde0eee5d1a0756dfe17178661e6aa..2a4c27bffb413aa5a128bc8d4e8d78fc7899c843 100644 (file)
@@ -8,8 +8,8 @@
 #include "include/buffer_fwd.h"
 #include "include/encoding.h"
 #include <string>
+#include <variant>
 #include <vector>
-#include <boost/variant.hpp>
 
 struct Context;
 
@@ -85,10 +85,10 @@ struct UnknownPayload {
   void dump(Formatter *f) const;
 };
 
-typedef boost::variant<HeartbeatPayload,
-                       LockAcquiredPayload,
-                       LockReleasedPayload,
-                       UnknownPayload> Payload;
+typedef std::variant<HeartbeatPayload,
+                    LockAcquiredPayload,
+                    LockReleasedPayload,
+                    UnknownPayload> Payload;
 
 struct NotifyMessage {
   NotifyMessage(const Payload &payload = UnknownPayload()) : payload(payload) {
index 3aab7201614fa65fb912d10b4f721cbc081295db..44715c3978930a20bd8674136e62d28fd78dbe58 100644 (file)
@@ -7,7 +7,7 @@
 #include "include/int_types.h"
 #include <iosfwd>
 #include <string>
-#include <boost/variant.hpp>
+#include <variant>
 
 namespace rbd {
 namespace mirror {
@@ -24,7 +24,7 @@ enum CalloutLevel {
 
 std::ostream& operator<<(std::ostream& os, const CalloutLevel& callout_level);
 
-typedef boost::variant<bool, uint64_t, std::string> AttributeValue;
+typedef std::variant<bool, uint64_t, std::string> AttributeValue;
 
 } // namespace service_daemon
 } // namespace mirror