]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
journal: auto-tune journal fetch params based on memory target
authorMykola Golub <mgolub@suse.com>
Wed, 24 Apr 2019 15:07:21 +0000 (16:07 +0100)
committerMykola Golub <mgolub@suse.com>
Tue, 11 Jun 2019 06:59:04 +0000 (07:59 +0100)
(if a cache manager is specified)

Signed-off-by: Mykola Golub <mgolub@suse.com>
22 files changed:
src/journal/JournalPlayer.cc
src/journal/JournalPlayer.h
src/journal/Journaler.cc
src/journal/Journaler.h
src/journal/ObjectPlayer.h
src/journal/Types.h [new file with mode: 0644]
src/librbd/Journal.cc
src/librbd/journal/CreateRequest.cc
src/librbd/journal/DemoteRequest.cc
src/librbd/journal/PromoteRequest.cc
src/librbd/journal/RemoveRequest.cc
src/librbd/journal/ResetRequest.cc
src/test/journal/mock/MockJournaler.h
src/test/journal/test_JournalPlayer.cc
src/test/journal/test_Journaler.cc
src/test/librbd/fsx.cc
src/test/librbd/journal/test_Entries.cc
src/test/librbd/test_mirroring.cc
src/test/rbd_mirror/test_ImageSync.cc
src/tools/rbd/action/Journal.cc
src/tools/rbd_mirror/image_replayer/CreateImageRequest.cc
src/tools/rbd_mirror/image_replayer/PrepareRemoteImageRequest.cc

index 89952e636a439274c273bf427d980babb61e4637..4b68f007e77b76b1aea8d90f284b91a881eaab4a 100644 (file)
@@ -1,9 +1,12 @@
 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
 // vim: ts=8 sw=2 smarttab
 
+#include "common/PriorityCache.h"
+#include "include/stringify.h"
 #include "journal/JournalPlayer.h"
 #include "journal/Entry.h"
 #include "journal/ReplayHandler.h"
+#include "journal/Types.h"
 #include "journal/Utils.h"
 
 #define dout_subsys ceph_subsys_journaler
@@ -14,6 +17,8 @@ namespace journal {
 
 namespace {
 
+static const uint64_t MIN_FETCH_BYTES = 32768;
+
 struct C_HandleComplete : public Context {
   ReplayHandler *replay_handler;
 
@@ -49,11 +54,14 @@ struct C_HandleEntriesAvailable : public Context {
 JournalPlayer::JournalPlayer(librados::IoCtx &ioctx,
                              const std::string &object_oid_prefix,
                              const JournalMetadataPtr& journal_metadata,
-                             ReplayHandler *replay_handler)
+                             ReplayHandler *replay_handler,
+                             CacheManagerHandler *cache_manager_handler)
   : m_cct(NULL), m_object_oid_prefix(object_oid_prefix),
     m_journal_metadata(journal_metadata), m_replay_handler(replay_handler),
-    m_lock("JournalPlayer::m_lock"), m_state(STATE_INIT), m_splay_offset(0),
-    m_watch_enabled(false), m_watch_scheduled(false), m_watch_interval(0) {
+    m_cache_manager_handler(cache_manager_handler),
+    m_cache_rebalance_handler(this), m_lock("JournalPlayer::m_lock"),
+    m_state(STATE_INIT), m_splay_offset(0), m_watch_enabled(false),
+    m_watch_scheduled(false), m_watch_interval(0) {
   m_replay_handler->get();
   m_ioctx.dup(ioctx);
   m_cct = reinterpret_cast<CephContext *>(m_ioctx.cct());
@@ -76,6 +84,21 @@ JournalPlayer::JournalPlayer(librados::IoCtx &ioctx,
       m_commit_positions[splay_offset] = position;
     }
   }
+
+  if (m_cache_manager_handler != nullptr) {
+    m_cache_name = "JournalPlayer/" + stringify(m_ioctx.get_id()) + "/" +
+        m_object_oid_prefix;
+    auto order = m_journal_metadata->get_order();
+    auto splay_width = m_journal_metadata->get_splay_width();
+    uint64_t min_size = MIN_FETCH_BYTES * splay_width;
+    uint64_t max_size = (2 << order) * splay_width;
+
+    m_cache_manager_handler->register_cache(m_cache_name, min_size, max_size,
+                                            &m_cache_rebalance_handler);
+    m_max_fetch_bytes = 0;
+  } else {
+    m_max_fetch_bytes = 2 << m_journal_metadata->get_order();
+  }
 }
 
 JournalPlayer::~JournalPlayer() {
@@ -87,11 +110,21 @@ JournalPlayer::~JournalPlayer() {
     ceph_assert(!m_watch_scheduled);
   }
   m_replay_handler->put();
+
+  if (m_cache_manager_handler != nullptr) {
+    m_cache_manager_handler->unregister_cache(m_cache_name);
+  }
 }
 
 void JournalPlayer::prefetch() {
   Mutex::Locker locker(m_lock);
   ceph_assert(m_state == STATE_INIT);
+
+  if (m_cache_manager_handler != nullptr && m_max_fetch_bytes == 0) {
+    m_state = STATE_WAITCACHE;
+    return;
+  }
+
   m_state = STATE_PREFETCH;
 
   m_active_set = m_journal_metadata->get_active_set();
@@ -601,9 +634,9 @@ void JournalPlayer::fetch(uint64_t object_num) {
   ObjectPlayerPtr object_player(new ObjectPlayer(
     m_ioctx, m_object_oid_prefix, object_num, m_journal_metadata->get_timer(),
     m_journal_metadata->get_timer_lock(), m_journal_metadata->get_order(),
-    m_journal_metadata->get_settings().max_fetch_bytes));
+    m_max_fetch_bytes));
 
-  uint8_t splay_width = m_journal_metadata->get_splay_width();
+  auto splay_width = m_journal_metadata->get_splay_width();
   m_object_players[object_num % splay_width] = object_player;
   fetch(object_player);
 }
@@ -800,4 +833,47 @@ void JournalPlayer::notify_complete(int r) {
     m_replay_handler), r);
 }
 
+void JournalPlayer::handle_cache_rebalanced(uint64_t new_cache_bytes) {
+  Mutex::Locker locker(m_lock);
+
+  if (m_state == STATE_ERROR) {
+    return;
+  }
+
+  auto splay_width = m_journal_metadata->get_splay_width();
+  m_max_fetch_bytes = p2align<uint64_t>(new_cache_bytes / splay_width, 4096);
+
+  ldout(m_cct, 10) << __func__ << ": new_cache_bytes=" << new_cache_bytes
+                   << ", max_fetch_bytes=" << m_max_fetch_bytes << dendl;
+
+  uint64_t min_bytes = MIN_FETCH_BYTES;
+
+  if (m_state == STATE_WAITCACHE) {
+    m_state = STATE_INIT;
+    if (m_max_fetch_bytes >= min_bytes) {
+      auto ctx = new FunctionContext(
+        [this](int r) {
+          prefetch();
+        });
+      m_journal_metadata->queue(ctx, 0);
+      return;
+    }
+  } else {
+    min_bytes = p2align<uint64_t>(min_bytes - (rand() % min_bytes) / 2, 4096);
+  }
+
+  if (m_max_fetch_bytes < min_bytes) {
+    lderr(m_cct) << __func__ << ": can't allocate enough memory from cache"
+                 << dendl;
+    m_state = STATE_ERROR;
+    notify_complete(-ENOMEM);
+    return;
+  }
+
+  for (auto &pair : m_object_players) {
+    pair.second->set_max_fetch_bytes(m_max_fetch_bytes);
+  }
+}
+
+
 } // namespace journal
index 09029061e5e4360a9922e742aa59d41c44d0468d..6ba54cc8babbf5e9e03a679cf39a0e2506256458 100644 (file)
@@ -11,6 +11,7 @@
 #include "common/Mutex.h"
 #include "journal/JournalMetadata.h"
 #include "journal/ObjectPlayer.h"
+#include "journal/Types.h"
 #include "cls/journal/cls_journal_types.h"
 #include <boost/none.hpp>
 #include <boost/optional.hpp>
@@ -20,6 +21,7 @@ class SafeTimer;
 
 namespace journal {
 
+class CacheManagerHandler;
 class Entry;
 class ReplayHandler;
 
@@ -31,7 +33,7 @@ public:
 
   JournalPlayer(librados::IoCtx &ioctx, const std::string &object_oid_prefix,
                 const JournalMetadataPtr& journal_metadata,
-                ReplayHandler *replay_handler);
+                ReplayHandler *replay_handler, CacheManagerHandler *cache_manager_handler);
   ~JournalPlayer();
 
   void prefetch();
@@ -48,6 +50,7 @@ private:
 
   enum State {
     STATE_INIT,
+    STATE_WAITCACHE,
     STATE_PREFETCH,
     STATE_PLAYBACK,
     STATE_ERROR
@@ -89,12 +92,27 @@ private:
     }
   };
 
+  struct CacheRebalanceHandler : public journal::CacheRebalanceHandler {
+    JournalPlayer *player;
+
+    CacheRebalanceHandler(JournalPlayer *player) : player(player) {
+    }
+
+    void handle_cache_rebalanced(uint64_t new_cache_bytes) override {
+      player->handle_cache_rebalanced(new_cache_bytes);
+    }
+  };
+
   librados::IoCtx m_ioctx;
   CephContext *m_cct;
   std::string m_object_oid_prefix;
-  JournalMetadataPtr m_journal_metadata;
-
+  JournalMetadataPtr m_journal_metadata;  
   ReplayHandler *m_replay_handler;
+  CacheManagerHandler *m_cache_manager_handler;
+
+  std::string m_cache_name;
+  CacheRebalanceHandler m_cache_rebalance_handler;
+  uint64_t m_max_fetch_bytes;
 
   AsyncOpTracker m_async_op_tracker;
 
@@ -150,6 +168,8 @@ private:
 
   void notify_entries_available();
   void notify_complete(int r);
+
+  void handle_cache_rebalanced(uint64_t new_cache_bytes);
 };
 
 } // namespace journal
index 9f78643703b32dc357a7d960c8884ec9ac624675..432421ae6e44fa9b4c2740e686d110453027a399 100644 (file)
@@ -73,9 +73,10 @@ Journaler::Threads::~Threads() {
 
 Journaler::Journaler(librados::IoCtx &header_ioctx,
                      const std::string &journal_id,
-                     const std::string &client_id, const Settings &settings)
+                     const std::string &client_id, const Settings &settings,
+                     CacheManagerHandler *cache_manager_handler)
     : m_threads(new Threads(reinterpret_cast<CephContext*>(header_ioctx.cct()))),
-      m_client_id(client_id) {
+      m_client_id(client_id), m_cache_manager_handler(cache_manager_handler) {
   set_up(m_threads->work_queue, m_threads->timer, &m_threads->timer_lock,
          header_ioctx, journal_id, settings);
 }
@@ -83,8 +84,9 @@ Journaler::Journaler(librados::IoCtx &header_ioctx,
 Journaler::Journaler(ContextWQ *work_queue, SafeTimer *timer,
                      Mutex *timer_lock, librados::IoCtx &header_ioctx,
                     const std::string &journal_id,
-                    const std::string &client_id, const Settings &settings)
-    : m_client_id(client_id) {
+                    const std::string &client_id, const Settings &settings,
+                     CacheManagerHandler *cache_manager_handler)
+    : m_client_id(client_id), m_cache_manager_handler(cache_manager_handler) {
   set_up(work_queue, timer, timer_lock, header_ioctx, journal_id,
          settings);
 }
@@ -436,7 +438,7 @@ void Journaler::flush_append(Context *on_safe) {
 void Journaler::create_player(ReplayHandler *replay_handler) {
   ceph_assert(m_player == nullptr);
   m_player = new JournalPlayer(m_data_ioctx, m_object_oid_prefix, m_metadata,
-                               replay_handler);
+                               replay_handler, m_cache_manager_handler);
 }
 
 void Journaler::get_metadata(uint8_t *order, uint8_t *splay_width,
index 1424cb7576129b8d23019acc5849ac2ea048766e..3f3987105e1870183d9c465c77a2f2c7b97f84fe 100644 (file)
@@ -22,6 +22,8 @@ class ThreadPool;
 
 namespace journal {
 
+struct CacheManagerHandler;
+
 class JournalMetadata;
 class JournalPlayer;
 class JournalRecorder;
@@ -52,10 +54,12 @@ public:
                                       const std::string &journal_id);
 
   Journaler(librados::IoCtx &header_ioctx, const std::string &journal_id,
-           const std::string &client_id, const Settings &settings);
+           const std::string &client_id, const Settings &settings,
+            CacheManagerHandler *cache_manager_handler);
   Journaler(ContextWQ *work_queue, SafeTimer *timer, Mutex *timer_lock,
             librados::IoCtx &header_ioctx, const std::string &journal_id,
-           const std::string &client_id, const Settings &settings);
+           const std::string &client_id, const Settings &settings,
+            CacheManagerHandler *cache_manager_handler);
   ~Journaler();
 
   void exists(Context *on_finish) const;
@@ -138,6 +142,7 @@ private:
   librados::IoCtx m_data_ioctx;
   CephContext *m_cct;
   std::string m_client_id;
+  CacheManagerHandler *m_cache_manager_handler;
 
   std::string m_header_oid;
   std::string m_object_oid_prefix;
index b9062b832b0d3dd04cd3a2cbb8e397ad52c08a37..3dfad125bc1f01d9784aa935a510c3cc776c9b8a 100644 (file)
@@ -78,6 +78,11 @@ public:
     m_refetch_state = refetch_state;
   }
 
+  inline void set_max_fetch_bytes(uint64_t max_fetch_bytes) {
+    Mutex::Locker locker(m_lock);
+    m_max_fetch_bytes = max_fetch_bytes;
+  }
+
 private:
   typedef std::pair<uint64_t, uint64_t> EntryKey;
   typedef boost::unordered_map<EntryKey, Entries::iterator> EntryKeys;
diff --git a/src/journal/Types.h b/src/journal/Types.h
new file mode 100644 (file)
index 0000000..8f8ce78
--- /dev/null
@@ -0,0 +1,28 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef CEPH_JOURNAL_TYPES_H
+#define CEPH_JOURNAL_TYPES_H
+
+namespace journal {
+
+struct CacheRebalanceHandler {
+  virtual ~CacheRebalanceHandler() {
+  }
+
+  virtual void handle_cache_rebalanced(uint64_t new_cache_bytes) = 0;
+};
+
+struct CacheManagerHandler {
+  virtual ~CacheManagerHandler() {
+  }
+
+  virtual void register_cache(const std::string &cache_name,
+                              uint64_t min_size, uint64_t max_size,
+                              CacheRebalanceHandler* handler) = 0;
+  virtual void unregister_cache(const std::string &cache_name) = 0;
+};
+
+} // namespace journal
+
+#endif // # CEPH_JOURNAL_TYPES_H
index 2f87146256667d036f1fcebe2e35198843d63771..5a648282fe997df2ab032b4e3d62c512a80a6637 100644 (file)
@@ -76,7 +76,7 @@ struct C_IsTagOwner : public Context {
       op_work_queue(op_work_queue), on_finish(on_finish),
       cct(reinterpret_cast<CephContext*>(io_ctx.cct())),
       journaler(new Journaler(io_ctx, image_id, Journal<>::IMAGE_CLIENT_ID,
-                              {})) {
+                              {}, nullptr)) {
   }
 
   void finish(int r) override {
@@ -113,7 +113,7 @@ struct C_GetTagOwner : public Context {
   C_GetTagOwner(librados::IoCtx &io_ctx, const std::string &image_id,
                 std::string *mirror_uuid, Context *on_finish)
     : mirror_uuid(mirror_uuid), on_finish(on_finish),
-      journaler(io_ctx, image_id, Journal<>::IMAGE_CLIENT_ID, {}) {
+      journaler(io_ctx, image_id, Journal<>::IMAGE_CLIENT_ID, {}, nullptr) {
   }
 
   virtual void finish(int r) {
@@ -459,7 +459,8 @@ int Journal<I>::request_resync(I *image_ctx) {
   CephContext *cct = image_ctx->cct;
   ldout(cct, 20) << __func__ << dendl;
 
-  Journaler journaler(image_ctx->md_ctx, image_ctx->id, IMAGE_CLIENT_ID, {});
+  Journaler journaler(image_ctx->md_ctx, image_ctx->id, IMAGE_CLIENT_ID, {},
+                      nullptr);
 
   Mutex lock("lock");
   journal::ImageClientMeta client_meta;
@@ -1074,7 +1075,7 @@ void Journal<I>::create_journaler() {
 
   m_journaler = new Journaler(m_work_queue, m_timer, m_timer_lock,
                              m_image_ctx.md_ctx, m_image_ctx.id,
-                             IMAGE_CLIENT_ID, settings);
+                             IMAGE_CLIENT_ID, settings, nullptr);
   m_journaler->add_listener(&m_metadata_listener);
 
   Context *ctx = create_async_context_callback(
index 4f10ec6571c13dd95bc875894cdb1b5a73f280dc..46f0d81d1b9cfc07d2689cc3c3f1c8bf7f83b8d5 100644 (file)
@@ -83,8 +83,8 @@ void CreateRequest<I>::create_journal() {
   ldout(m_cct, 20) << this << " " << __func__ << dendl;
 
   ImageCtx::get_timer_instance(m_cct, &m_timer, &m_timer_lock);
-  m_journaler = new Journaler(m_op_work_queue, m_timer, m_timer_lock,
-                              m_ioctx, m_image_id, m_image_client_id, {});
+  m_journaler = new Journaler(m_op_work_queue, m_timer, m_timer_lock, m_ioctx,
+                              m_image_id, m_image_client_id, {}, nullptr);
 
   using klass = CreateRequest<I>;
   Context *ctx = create_context_callback<klass, &klass::handle_create_journal>(this);
index 59aa0365a3f8d30e19aa8f9a32b55ae9a5ffc547..5b34942684e3903470960afb0dbf552443a973d7 100644 (file)
@@ -45,7 +45,7 @@ void DemoteRequest<I>::open_journaler() {
   ldout(cct, 20) << dendl;
 
   m_journaler = new Journaler(m_image_ctx.md_ctx, m_image_ctx.id,
-                              Journal<>::IMAGE_CLIENT_ID, {});
+                              Journal<>::IMAGE_CLIENT_ID, {}, nullptr);
   auto ctx = create_async_context_callback(
     m_image_ctx, create_context_callback<
       DemoteRequest<I>, &DemoteRequest<I>::handle_open_journaler>(this));
index 695acc388aaad67ea374f6f64a74172eb50b4713..30d9f3bb159f74c3235a44ff100d36dc324976d6 100644 (file)
@@ -40,7 +40,7 @@ void PromoteRequest<I>::send_open() {
   ldout(cct, 20) << dendl;
 
   m_journaler = new Journaler(m_image_ctx->md_ctx, m_image_ctx->id,
-                              Journal<>::IMAGE_CLIENT_ID, {});
+                              Journal<>::IMAGE_CLIENT_ID, {}, nullptr);
   Context *ctx = create_async_context_callback(
     *m_image_ctx, create_context_callback<
       PromoteRequest<I>, &PromoteRequest<I>::handle_open>(this));
index 6ed5f54c3b53e2d20f34279d9201de83e776ee7a..6bdabf40093f5361ac9d00cb24a2ec8e3c1f9fe3 100644 (file)
@@ -42,8 +42,8 @@ void RemoveRequest<I>::stat_journal() {
   ldout(m_cct, 20) << this << " " << __func__ << dendl;
 
   ImageCtx::get_timer_instance(m_cct, &m_timer, &m_timer_lock);
-  m_journaler = new Journaler(m_op_work_queue, m_timer, m_timer_lock,
-                              m_ioctx, m_image_id, m_image_client_id, {});
+  m_journaler = new Journaler(m_op_work_queue, m_timer, m_timer_lock, m_ioctx,
+                              m_image_id, m_image_client_id, {}, nullptr);
 
   using klass = RemoveRequest<I>;
   Context *ctx = create_context_callback<klass, &klass::handle_stat_journal>(this);
index 9b67f3e452ce74361ac844b03879f4c277b50a47..895d0046e942a0ba5bdbc65c01944a045e42daa3 100644 (file)
@@ -34,7 +34,7 @@ template<typename I>
 void ResetRequest<I>::init_journaler() {
   ldout(m_cct, 10) << dendl;
 
-  m_journaler = new Journaler(m_io_ctx, m_image_id, m_client_id, {});
+  m_journaler = new Journaler(m_io_ctx, m_image_id, m_client_id, {}, nullptr);
   Context *ctx = create_context_callback<
      ResetRequest<I>, &ResetRequest<I>::handle_init_journaler>(this);
   m_journaler->init(ctx);
index b925ddfebe9e95c61fd86c79bded12b47d91df18..787d197dd934742f649192db4acf8c21cd03f821 100644 (file)
@@ -143,7 +143,8 @@ struct MockJournalerProxy {
 
   template <typename IoCtxT>
   MockJournalerProxy(IoCtxT &header_ioctx, const std::string &,
-                     const std::string &, const Settings&) {
+                     const std::string &, const Settings&,
+                     journal::CacheManagerHandler *) {
     MockJournaler::get_instance().construct();
   }
 
@@ -151,7 +152,8 @@ struct MockJournalerProxy {
   MockJournalerProxy(WorkQueue *work_queue, Timer *timer, Mutex *timer_lock,
                      librados::IoCtx &header_ioctx,
                      const std::string &journal_id,
-                     const std::string &client_id, const Settings&) {
+                     const std::string &client_id, const Settings&,
+                     journal::CacheManagerHandler *) {
     MockJournaler::get_instance().construct();
   }
 
index 3ae04c07ad94b6635d896f017e5aa6f3479f0ef3..5035805183058a774c2d3d42160ff6fe3450b267 100644 (file)
@@ -78,7 +78,7 @@ public:
   journal::JournalPlayer *create_player(const std::string &oid,
                                         const journal::JournalMetadataPtr &metadata) {
     journal::JournalPlayer *player(new journal::JournalPlayer(
-      m_ioctx, oid + ".", metadata, &m_replay_hander));
+      m_ioctx, oid + ".", metadata, &m_replay_hander, nullptr));
     m_players.push_back(player);
     return player;
   }
index cc7f2c051846df6189250c28adf77e5c7a980f65..836816581a9428f95325d259ed03c93b8a69ce82 100644 (file)
@@ -27,7 +27,8 @@ public:
     RadosTestFixture::SetUp();
     m_journal_id = get_temp_journal_id();
     m_journaler = new journal::Journaler(m_work_queue, m_timer, &m_timer_lock,
-                                         m_ioctx, m_journal_id, CLIENT_ID, {});
+                                         m_ioctx, m_journal_id, CLIENT_ID, {},
+                                         nullptr);
   }
 
   void TearDown() override {
@@ -54,8 +55,8 @@ public:
   }
 
   int register_client(const std::string &client_id, const std::string &desc) {
-    journal::Journaler journaler(m_work_queue, m_timer, &m_timer_lock,
-                                 m_ioctx, m_journal_id, client_id, {});
+    journal::Journaler journaler(m_work_queue, m_timer, &m_timer_lock, m_ioctx,
+                                 m_journal_id, client_id, {}, nullptr);
     bufferlist data;
     data.append(desc);
     C_SaferCond cond;
@@ -64,8 +65,8 @@ public:
   }
 
   int update_client(const std::string &client_id, const std::string &desc) {
-    journal::Journaler journaler(m_work_queue, m_timer, &m_timer_lock,
-                                 m_ioctx, m_journal_id, client_id, {});
+    journal::Journaler journaler(m_work_queue, m_timer, &m_timer_lock, m_ioctx,
+                                 m_journal_id, client_id, {}, nullptr);
     bufferlist data;
     data.append(desc);
     C_SaferCond cond;
@@ -74,8 +75,8 @@ public:
   }
 
   int unregister_client(const std::string &client_id) {
-    journal::Journaler journaler(m_work_queue, m_timer, &m_timer_lock,
-                                 m_ioctx, m_journal_id, client_id, {});
+    journal::Journaler journaler(m_work_queue, m_timer, &m_timer_lock, m_ioctx,
+                                 m_journal_id, client_id, {}, nullptr);
     C_SaferCond cond;
     journaler.unregister_client(&cond);
     return cond.wait();
index e0b40937d316b8ef582944dd2ad12f0529018938..1e96b502798f4baeee27ea466d7c3f3a3b46ab21 100644 (file)
@@ -329,7 +329,8 @@ int register_journal(rados_ioctx_t ioctx, const char *image_name) {
                 return r;
         }
 
-        journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, {});
+        journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, {},
+                                     nullptr);
         r = journaler.register_client(bufferlist());
         if (r < 0) {
                 simple_err("failed to register journal client", r);
@@ -348,7 +349,8 @@ int unregister_journal(rados_ioctx_t ioctx, const char *image_name) {
                 return r;
         }
 
-        journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, {});
+        journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, {},
+                                     nullptr);
         r = journaler.unregister_client();
         if (r < 0) {
                 simple_err("failed to unregister journal client", r);
@@ -404,7 +406,8 @@ int replay_journal(rados_ioctx_t ioctx, const char *image_name,
                 return r;
         }
 
-        journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, {});
+        journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, {},
+                                     nullptr);
         C_SaferCond init_ctx;
         journaler.init(&init_ctx);
         BOOST_SCOPE_EXIT_ALL( (&journaler) ) {
@@ -417,7 +420,8 @@ int replay_journal(rados_ioctx_t ioctx, const char *image_name,
                 return r;
         }
 
-        journal::Journaler replay_journaler(io_ctx, replay_image_id, "", {});
+        journal::Journaler replay_journaler(io_ctx, replay_image_id, "", {},
+                                            nullptr);
 
         C_SaferCond replay_init_ctx;
         replay_journaler.init(&replay_init_ctx);
index 7b013e76ad0f05d2313d83348cab319d65792275..7ee8174b412ef2b7cd4561c37d312e8543eb713e 100644 (file)
@@ -67,7 +67,7 @@ public:
 
   journal::Journaler *create_journaler(librbd::ImageCtx *ictx) {
     journal::Journaler *journaler = new journal::Journaler(
-      ictx->md_ctx, ictx->id, "dummy client", {});
+      ictx->md_ctx, ictx->id, "dummy client", {}, nullptr);
 
     int r = journaler->register_client(bufferlist());
     if (r < 0) {
index 1aa72da51774d7ed1a24a432a3886243a96102fa..fd34187b2cfb1a4530e032847738ee14ad79a69c 100644 (file)
@@ -329,7 +329,7 @@ public:
       "remote-image-id", {{{}, "sync-point-snap", boost::none}}, {});
     librbd::journal::ClientData client_data(peer_client_meta);
 
-    journal::Journaler journaler(io_ctx, image_id, "peer-client", {});
+    journal::Journaler journaler(io_ctx, image_id, "peer-client", {}, nullptr);
     C_SaferCond init_ctx;
     journaler.init(&init_ctx);
     ASSERT_EQ(-ENOENT, init_ctx.wait());
index 36a2b35e112122ae095d01d35481141b8c805df1..49fba242316a2c0b2d35a1de15f3a743bc557c07 100644 (file)
@@ -77,7 +77,7 @@ public:
 
     m_remote_journaler = new ::journal::Journaler(
       m_threads->work_queue, m_threads->timer, &m_threads->timer_lock,
-      m_remote_io_ctx, m_remote_image_ctx->id, "mirror-uuid", {});
+      m_remote_io_ctx, m_remote_image_ctx->id, "mirror-uuid", {}, nullptr);
 
     m_client_meta = {"image-id"};
 
index c46364facd942d111f4970ec81717f83c5d778ae..76f76b1c5ebc7d937080ea2a6d698001f6522a48 100644 (file)
@@ -378,7 +378,7 @@ class Journaler : public ::journal::Journaler {
 public:
   Journaler(librados::IoCtx& io_ctx, const std::string& journal_id,
            const std::string &client_id) :
-    ::journal::Journaler(io_ctx, journal_id, client_id, {}) {
+    ::journal::Journaler(io_ctx, journal_id, client_id, {}, nullptr) {
   }
 
   int init() {
index 9aef91541650d715f3e8069a32e86976d2e025f8..e54a76e07335b4bf0640cd752bcd3ec576dd90ea 100644 (file)
@@ -157,7 +157,7 @@ void CreateImageRequest<I>::get_remote_parent_client_state() {
                                      &m_threads->timer_lock,
                                      m_remote_parent_io_ctx,
                                      m_remote_parent_spec.image_id,
-                                     m_local_parent_mirror_uuid, {});
+                                     m_local_parent_mirror_uuid, {}, nullptr);
 
   Context *ctx = create_async_context_callback(
     m_threads->work_queue, create_context_callback<
index 00c141e0bc1cb5f2641e25e6155b4ccc68e4b12c..331c5f9e1fbb532aa6cd39a0deff73e1f45bd4a0 100644 (file)
@@ -109,7 +109,7 @@ void PrepareRemoteImageRequest<I>::get_client() {
   *m_remote_journaler = new Journaler(m_threads->work_queue, m_threads->timer,
                                       &m_threads->timer_lock, m_remote_io_ctx,
                                       *m_remote_image_id, m_local_mirror_uuid,
-                                      m_journal_settings);
+                                      m_journal_settings, nullptr);
 
   Context *ctx = create_async_context_callback(
     m_threads->work_queue, create_context_callback<