]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
journal: helper class for organizing optional settings
authorJason Dillaman <dillaman@redhat.com>
Mon, 18 Jul 2016 13:31:40 +0000 (09:31 -0400)
committerJason Dillaman <dillaman@redhat.com>
Wed, 17 Aug 2016 17:22:05 +0000 (13:22 -0400)
Additional runtime configuration settings will be needed. The
new class will avoid the need to expand the constructor.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit dad8328f2d502d18923c35f7b86a0cc2ccec133a)

16 files changed:
src/journal/JournalMetadata.cc
src/journal/JournalMetadata.h
src/journal/Journaler.cc
src/journal/Journaler.h
src/journal/Makefile.am
src/journal/Settings.h [new file with mode: 0644]
src/librbd/Journal.cc
src/test/journal/RadosTestFixture.cc
src/test/journal/mock/MockJournaler.h
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/ImageReplayer.cc

index 8fc5634a882e000c9dcce9b058e667392068e2c4..63c67f21cdb1ad89a52d4c8a6c82475e485f12ac 100644 (file)
@@ -402,9 +402,9 @@ JournalMetadata::JournalMetadata(ContextWQ *work_queue, SafeTimer *timer,
                                  Mutex *timer_lock, librados::IoCtx &ioctx,
                                  const std::string &oid,
                                  const std::string &client_id,
-                                 double commit_interval)
+                                 const Settings &settings)
     : RefCountedObject(NULL, 0), m_cct(NULL), m_oid(oid),
-      m_client_id(client_id), m_commit_interval(commit_interval), m_order(0),
+      m_client_id(client_id), m_settings(settings), m_order(0),
       m_splay_width(0), m_pool_id(-1), m_initialized(false),
       m_work_queue(work_queue), m_timer(timer), m_timer_lock(timer_lock),
       m_lock("JournalMetadata::m_lock"), m_commit_tid(0), m_watch_ctx(this),
@@ -795,7 +795,8 @@ void JournalMetadata::schedule_commit_task() {
   assert(m_commit_position_ctx != nullptr);
   if (m_commit_position_task_ctx == NULL) {
     m_commit_position_task_ctx = new C_CommitPositionTask(this);
-    m_timer->add_event_after(m_commit_interval, m_commit_position_task_ctx);
+    m_timer->add_event_after(m_settings.commit_interval,
+                             m_commit_position_task_ctx);
   }
 }
 
@@ -1045,7 +1046,7 @@ std::ostream &operator<<(std::ostream &os,
      << "active_set=" << jm.m_active_set << ", "
      << "client_id=" << jm.m_client_id << ", "
      << "commit_tid=" << jm.m_commit_tid << ", "
-     << "commit_interval=" << jm.m_commit_interval << ", "
+     << "commit_interval=" << jm.m_settings.commit_interval << ", "
      << "commit_position=" << jm.m_commit_position << ", "
      << "registered_clients=" << jm.m_registered_clients << "]";
   return os;
index c2fa711b9f8e13f719b0d327330db9dcca4e0843..046e77dac7b47ccf20a7549d2809ced0bafe65e2 100644 (file)
@@ -14,6 +14,7 @@
 #include "cls/journal/cls_journal_types.h"
 #include "journal/AsyncOpTracker.h"
 #include "journal/JournalMetadataListener.h"
+#include "journal/Settings.h"
 #include <boost/intrusive_ptr.hpp>
 #include <boost/noncopyable.hpp>
 #include <boost/optional.hpp>
@@ -44,7 +45,7 @@ public:
 
   JournalMetadata(ContextWQ *work_queue, SafeTimer *timer, Mutex *timer_lock,
                   librados::IoCtx &ioctx, const std::string &oid,
-                  const std::string &client_id, double commit_interval);
+                  const std::string &client_id, const Settings &settings);
   ~JournalMetadata();
 
   void init(Context *on_init);
@@ -287,7 +288,7 @@ private:
   CephContext *m_cct;
   std::string m_oid;
   std::string m_client_id;
-  double m_commit_interval;
+  Settings m_settings;
 
   uint8_t m_order;
   uint8_t m_splay_width;
index 7bfbbe956e4949f368b7d27c84b586e965534251..05d80693dc8619e123c0bfb637a0971dcc7b4cdd 100644 (file)
@@ -68,25 +68,26 @@ Journaler::Threads::~Threads() {
 
 Journaler::Journaler(librados::IoCtx &header_ioctx,
                      const std::string &journal_id,
-                     const std::string &client_id, double commit_interval)
+                     const std::string &client_id, const Settings &settings)
     : m_threads(new Threads(reinterpret_cast<CephContext*>(header_ioctx.cct()))),
       m_client_id(client_id) {
   set_up(m_threads->work_queue, m_threads->timer, &m_threads->timer_lock,
-         header_ioctx, journal_id, commit_interval);
+         header_ioctx, journal_id, settings);
 }
 
 Journaler::Journaler(ContextWQ *work_queue, SafeTimer *timer,
                      Mutex *timer_lock, librados::IoCtx &header_ioctx,
                     const std::string &journal_id,
-                    const std::string &client_id, double commit_interval)
+                    const std::string &client_id, const Settings &settings)
     : m_client_id(client_id) {
   set_up(work_queue, timer, timer_lock, header_ioctx, journal_id,
-         commit_interval);
+         settings);
 }
 
 void Journaler::set_up(ContextWQ *work_queue, SafeTimer *timer,
                        Mutex *timer_lock, librados::IoCtx &header_ioctx,
-                       const std::string &journal_id, double commit_interval) {
+                       const std::string &journal_id,
+                       const Settings &settings) {
   m_header_ioctx.dup(header_ioctx);
   m_cct = reinterpret_cast<CephContext *>(m_header_ioctx.cct());
 
@@ -95,7 +96,7 @@ void Journaler::set_up(ContextWQ *work_queue, SafeTimer *timer,
 
   m_metadata = new JournalMetadata(work_queue, timer, timer_lock,
                                    m_header_ioctx, m_header_oid, m_client_id,
-                                   commit_interval);
+                                   settings);
   m_metadata->get();
 }
 
index afa3c880754734d961b7036207e32cba5fdc2b8a..93a89bb1ff175192c8a4d7cc6aca5ada13fba1f1 100644 (file)
@@ -28,6 +28,7 @@ class JournalRecorder;
 class JournalTrimmer;
 class ReplayEntry;
 class ReplayHandler;
+class Settings;
 
 class Journaler {
 public:
@@ -51,10 +52,10 @@ public:
                                       const std::string &journal_id);
 
   Journaler(librados::IoCtx &header_ioctx, const std::string &journal_id,
-           const std::string &client_id, double commit_interval);
+           const std::string &client_id, const Settings &settings);
   Journaler(ContextWQ *work_queue, SafeTimer *timer, Mutex *timer_lock,
             librados::IoCtx &header_ioctx, const std::string &journal_id,
-           const std::string &client_id, double commit_interval);
+           const std::string &client_id, const Settings &settings);
   ~Journaler();
 
   int exists(bool *header_exists) const;
@@ -145,7 +146,7 @@ private:
 
   void set_up(ContextWQ *work_queue, SafeTimer *timer, Mutex *timer_lock,
               librados::IoCtx &header_ioctx, const std::string &journal_id,
-              double commit_interval);
+              const Settings &settings);
 
   int init_complete();
   void create_player(ReplayHandler *replay_handler);
index 8e222d95d6b7a28638fc5a8163435e53a1793e0e..ad4d54dc48850eda895d591eb3a626bf9ad2687a 100644 (file)
@@ -31,6 +31,7 @@ noinst_HEADERS += \
        journal/ObjectRecorder.h \
        journal/ReplayEntry.h \
        journal/ReplayHandler.h \
+       journal/Settings.h \
        journal/Utils.h
 DENCODER_DEPS += libjournal.la
 
diff --git a/src/journal/Settings.h b/src/journal/Settings.h
new file mode 100644 (file)
index 0000000..9580734
--- /dev/null
@@ -0,0 +1,17 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef CEPH_JOURNAL_SETTINGS_H
+#define CEPH_JOURNAL_SETTINGS_H
+
+#include "include/int_types.h"
+
+namespace journal {
+
+struct Settings {
+  double commit_interval = 5;         ///< commit position throttle (in secs)
+};
+
+} // namespace journal
+
+#endif // # CEPH_JOURNAL_SETTINGS_H
index ef327ed8f93bc4478d6e659eabc12863b5fa2b41..c8c5c356d4309862244cbb2ed5709d00447fac3a 100644 (file)
@@ -11,6 +11,7 @@
 #include "cls/journal/cls_journal_types.h"
 #include "journal/Journaler.h"
 #include "journal/ReplayEntry.h"
+#include "journal/Settings.h"
 #include "common/errno.h"
 #include "common/Timer.h"
 #include "common/WorkQueue.h"
@@ -372,8 +373,7 @@ int Journal<I>::create(librados::IoCtx &io_ctx, const std::string &image_id,
     pool_id = data_io_ctx.get_id();
   }
 
-  Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID,
-                      cct->_conf->rbd_journal_commit_age);
+  Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID, {});
 
   int r = journaler.create(order, splay_width, pool_id);
   if (r < 0) {
@@ -411,8 +411,7 @@ int Journal<I>::remove(librados::IoCtx &io_ctx, const std::string &image_id) {
   CephContext *cct = reinterpret_cast<CephContext *>(io_ctx.cct());
   ldout(cct, 5) << __func__ << ": image=" << image_id << dendl;
 
-  Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID,
-                      cct->_conf->rbd_journal_commit_age);
+  Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID, {});
 
   bool journal_exists;
   int r = journaler.exists(&journal_exists);
@@ -453,8 +452,7 @@ int Journal<I>::reset(librados::IoCtx &io_ctx, const std::string &image_id) {
   CephContext *cct = reinterpret_cast<CephContext *>(io_ctx.cct());
   ldout(cct, 5) << __func__ << ": image=" << image_id << dendl;
 
-  Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID,
-                      cct->_conf->rbd_journal_commit_age);
+  Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID, {});
 
   C_SaferCond cond;
   journaler.init(&cond);
@@ -531,8 +529,7 @@ int Journal<I>::get_tag_owner(IoCtx& io_ctx, std::string& image_id,
   CephContext *cct = (CephContext *)io_ctx.cct();
   ldout(cct, 20) << __func__ << dendl;
 
-  Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID,
-                      cct->_conf->rbd_journal_commit_age);
+  Journaler journaler(io_ctx, image_id, IMAGE_CLIENT_ID, {});
 
   cls::journal::Client client;
   journal::ImageClientMeta client_meta;
@@ -551,8 +548,7 @@ 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,
-                      image_ctx->cct->_conf->rbd_journal_commit_age);
+  Journaler journaler(image_ctx->md_ctx, image_ctx->id, IMAGE_CLIENT_ID, {});
 
   cls::journal::Client client;
   journal::ImageClientMeta client_meta;
@@ -590,8 +586,7 @@ int Journal<I>::promote(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,
-                      image_ctx->cct->_conf->rbd_journal_commit_age);
+  Journaler journaler(image_ctx->md_ctx, image_ctx->id, IMAGE_CLIENT_ID, {});
 
   cls::journal::Client client;
   journal::ImageClientMeta client_meta;
@@ -1192,9 +1187,12 @@ void Journal<I>::create_journaler() {
   assert(m_journaler == NULL);
 
   transition_state(STATE_INITIALIZING, 0);
+  ::journal::Settings settings;
+  settings.commit_interval = m_image_ctx.journal_commit_age;
+
   m_journaler = new Journaler(m_work_queue, m_timer, m_timer_lock,
                              m_image_ctx.md_ctx, m_image_ctx.id,
-                             IMAGE_CLIENT_ID, m_image_ctx.journal_commit_age);
+                             IMAGE_CLIENT_ID, settings);
   m_journaler->init(create_async_context_callback(
     m_image_ctx, create_context_callback<
       Journal<I>, &Journal<I>::handle_initialized>(this)));
index f57e5aed8c42cb2f5b4615a6b504ebafaa8de3f7..40ff485203aff4195c290afc6009e7265a96740f 100644 (file)
@@ -5,6 +5,7 @@
 #include "cls/journal/cls_journal_client.h"
 #include "include/stringify.h"
 #include "common/WorkQueue.h"
+#include "journal/Settings.h"
 
 RadosTestFixture::RadosTestFixture()
   : m_timer_lock("m_timer_lock"), m_timer(NULL), m_listener(this) {
@@ -67,10 +68,12 @@ int RadosTestFixture::create(const std::string &oid, uint8_t order,
 
 journal::JournalMetadataPtr RadosTestFixture::create_metadata(
     const std::string &oid, const std::string &client_id,
-    double commit_internal) {
+    double commit_interval) {
+  journal::Settings settings;
+  settings.commit_interval = commit_interval;
+
   journal::JournalMetadataPtr metadata(new journal::JournalMetadata(
-    m_work_queue, m_timer, &m_timer_lock, m_ioctx, oid, client_id,
-    commit_internal));
+    m_work_queue, m_timer, &m_timer_lock, m_ioctx, oid, client_id, settings));
   m_metadatas.push_back(metadata);
   return metadata;
 }
index aab3ec1c1ffb7be8609b2fe7872d3c9482cead48..e1998ff0e42b6fbeb8c08bc947f003024740f0ad 100644 (file)
@@ -20,6 +20,7 @@ class SafeTimer;
 namespace journal {
 
 struct ReplayHandler;
+struct Settings;
 
 struct MockFuture {
   static MockFuture *s_instance;
@@ -136,13 +137,13 @@ struct MockJournaler {
 struct MockJournalerProxy {
   template <typename IoCtxT>
   MockJournalerProxy(IoCtxT &header_ioctx, const std::string &,
-                     const std::string &, double) {
+                     const std::string &, const Settings&) {
     MockJournaler::get_instance().construct();
   }
 
   MockJournalerProxy(ContextWQ *work_queue, SafeTimer *timer, Mutex *timer_lock,
                      librados::IoCtx &header_ioctx, const std::string &journal_id,
-                     const std::string &client_id, double commit_interval) {
+                     const std::string &client_id, const Settings&) {
     MockJournaler::get_instance().construct();
   }
 
index 4a4ecbae0199512db06243122ac58b3b017d5876..d40069505c10825a93d37c49eec44efc196ed360 100644 (file)
@@ -2,6 +2,7 @@
 // vim: ts=8 sw=2 smarttab
 
 #include "journal/Journaler.h"
+#include "journal/Settings.h"
 #include "include/stringify.h"
 #include "gtest/gtest.h"
 #include "test/librados/test.h"
@@ -21,7 +22,7 @@ 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, 5);
+                                         m_ioctx, m_journal_id, CLIENT_ID, {});
   }
 
   virtual void TearDown() {
@@ -47,7 +48,7 @@ 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, 5);
+                                 m_ioctx, m_journal_id, client_id, {});
     bufferlist data;
     data.append(desc);
     C_SaferCond cond;
@@ -57,7 +58,7 @@ 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, 5);
+                                 m_ioctx, m_journal_id, client_id, {});
     bufferlist data;
     data.append(desc);
     C_SaferCond cond;
@@ -67,7 +68,7 @@ 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, 5);
+                                 m_ioctx, m_journal_id, client_id, {});
     C_SaferCond cond;
     journaler.unregister_client(&cond);
     return cond.wait();
index 2a06b345e6d464f24ef4f451ad18d68672a019d8..ddcb9b709a118e25d07d993d4b983926dc576053 100644 (file)
@@ -53,6 +53,7 @@
 #include "journal/Journaler.h"
 #include "journal/ReplayEntry.h"
 #include "journal/ReplayHandler.h"
+#include "journal/Settings.h"
 
 #include <boost/scope_exit.hpp>
 
@@ -322,7 +323,7 @@ int register_journal(rados_ioctx_t ioctx, const char *image_name) {
                 return r;
         }
 
-        journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, 0);
+        journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, {});
         r = journaler.register_client(bufferlist());
         if (r < 0) {
                 simple_err("failed to register journal client", r);
@@ -341,7 +342,7 @@ int unregister_journal(rados_ioctx_t ioctx, const char *image_name) {
                 return r;
         }
 
-        journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, 0);
+        journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, {});
         r = journaler.unregister_client();
         if (r < 0) {
                 simple_err("failed to unregister journal client", r);
@@ -393,7 +394,7 @@ int replay_journal(rados_ioctx_t ioctx, const char *image_name,
                 return r;
         }
 
-        journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, 0);
+        journal::Journaler journaler(io_ctx, image_id, JOURNAL_CLIENT_ID, {});
         C_SaferCond init_ctx;
         journaler.init(&init_ctx);
         BOOST_SCOPE_EXIT_ALL( (&journaler) ) {
@@ -406,7 +407,7 @@ int replay_journal(rados_ioctx_t ioctx, const char *image_name,
                 return r;
         }
 
-        journal::Journaler replay_journaler(io_ctx, replay_image_id, "", 0);
+        journal::Journaler replay_journaler(io_ctx, replay_image_id, "", {});
 
         C_SaferCond replay_init_ctx;
         replay_journaler.init(&replay_init_ctx);
index bd984fd16928e40f87bf29c37d190720be44f0ff..3fd24f27c688cb0d9419a6cc7d206ea97fb69ed1 100644 (file)
@@ -11,6 +11,7 @@
 #include "journal/Journaler.h"
 #include "journal/ReplayEntry.h"
 #include "journal/ReplayHandler.h"
+#include "journal/Settings.h"
 #include <list>
 #include <boost/variant.hpp>
 
@@ -66,7 +67,7 @@ public:
 
   journal::Journaler *create_journaler(librbd::ImageCtx *ictx) {
     journal::Journaler *journaler = new journal::Journaler(
-      ictx->md_ctx, ictx->id, "dummy client", 1);
+      ictx->md_ctx, ictx->id, "dummy client", {});
 
     int r = journaler->register_client(bufferlist());
     if (r < 0) {
index 758fc456fdb34b59cab205cf5643256df33d75bf..cd59dd711fbdc48c6c7a105ed1224d047b850761 100644 (file)
@@ -24,6 +24,7 @@
 #include "librbd/Operations.h"
 #include "librbd/journal/Types.h"
 #include "journal/Journaler.h"
+#include "journal/Settings.h"
 #include <boost/scope_exit.hpp>
 #include <boost/assign/list_of.hpp>
 #include <utility>
@@ -267,7 +268,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", 5);
+    journal::Journaler journaler(io_ctx, image_id, "peer-client", {});
     C_SaferCond init_ctx;
     journaler.init(&init_ctx);
     ASSERT_EQ(-ENOENT, init_ctx.wait());
index 922d49933174019cc94ed4b46235c370df303264..609716909a1c2c4760fa431a3c6b2f69e1d2d56e 100644 (file)
@@ -5,6 +5,7 @@
 #include "include/stringify.h"
 #include "include/rbd/librbd.hpp"
 #include "journal/Journaler.h"
+#include "journal/Settings.h"
 #include "librbd/AioImageRequestWQ.h"
 #include "librbd/ExclusiveLock.h"
 #include "librbd/ImageCtx.h"
@@ -54,7 +55,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", 5);
+      m_remote_io_ctx, m_remote_image_ctx->id, "mirror-uuid", {});
 
     m_client_meta = {"image-id"};
 
index 0c85c26a9a291d7d252dc423bbd253196d109c1c..ca2620a81278319582ff31abce9cbd5de601f1af 100644 (file)
@@ -20,6 +20,7 @@
 #include "journal/Journaler.h"
 #include "journal/ReplayEntry.h"
 #include "journal/ReplayHandler.h"
+#include "journal/Settings.h"
 #include "librbd/journal/Types.h"
 
 namespace rbd {
@@ -171,7 +172,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, 5) {
+    ::journal::Journaler(io_ctx, journal_id, client_id, {}) {
   }
 
   int init() {
index ed661542cc05da969c7ead13975b2757a0ebd2fc..9bdca879225e4a8ca6b3ff5e4214607c7e844f07 100644 (file)
@@ -11,6 +11,7 @@
 #include "global/global_context.h"
 #include "journal/Journaler.h"
 #include "journal/ReplayHandler.h"
+#include "journal/Settings.h"
 #include "librbd/ExclusiveLock.h"
 #include "librbd/ImageCtx.h"
 #include "librbd/ImageState.h"
@@ -378,12 +379,14 @@ void ImageReplayer<I>::start(Context *on_finish,
   }
 
   CephContext *cct = static_cast<CephContext *>(m_local->cct());
-  double commit_interval = cct->_conf->rbd_journal_commit_age;
+  journal::Settings settings;
+  settings.commit_interval = cct->_conf->rbd_journal_commit_age;
+
   m_remote_journaler = new Journaler(m_threads->work_queue,
                                      m_threads->timer,
                                     &m_threads->timer_lock, m_remote_ioctx,
                                     m_remote_image_id, m_local_mirror_uuid,
-                                     commit_interval);
+                                     settings);
   bootstrap();
 }