]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: optionally flag "laggy" journal clients disconnected
authorMykola Golub <mgolub@mirantis.com>
Wed, 27 Jul 2016 11:06:42 +0000 (14:06 +0300)
committerJason Dillaman <dillaman@redhat.com>
Tue, 11 Oct 2016 16:40:37 +0000 (12:40 -0400)
Fixes: http://tracker.ceph.com/issues/14738
Signed-off-by: Mykola Golub <mgolub@mirantis.com>
(cherry picked from commit b8eafefba9f2221a0ce927568795cb1c3ac0fa9c)

src/common/config_opts.h
src/librbd/ImageCtx.cc
src/librbd/ImageCtx.h
src/librbd/Journal.cc
src/test/librbd/mock/MockImageCtx.h

index 8ee70e3c31d4c848fc35178694fc4f2da9e7d2ef..ba1c48c40648e5755eeb79fbce84372bb19e4cd3 100644 (file)
@@ -1212,6 +1212,7 @@ OPTION(rbd_journal_object_flush_bytes, OPT_INT, 0) // maximum number of pending
 OPTION(rbd_journal_object_flush_age, OPT_DOUBLE, 0) // maximum age (in seconds) for pending commits
 OPTION(rbd_journal_pool, OPT_STR, "") // pool for journal objects
 OPTION(rbd_journal_max_payload_bytes, OPT_U32, 16384) // maximum journal payload size before splitting
+OPTION(rbd_journal_max_concurrent_object_sets, OPT_INT, 0) // maximum number of object sets a journal client can be behind before it is automatically unregistered
 
 /**
  * RBD Mirror options
index df1d837a106bbd919660d1549f2b4609403cc464..c1d21f070cb405984899be910690bcb2d277e7ae 100644 (file)
@@ -929,7 +929,8 @@ struct C_InvalidateCache : public Context {
         "rbd_journal_object_flush_bytes", false)(
         "rbd_journal_object_flush_age", false)(
         "rbd_journal_pool", false)(
-        "rbd_journal_max_payload_bytes", false);
+        "rbd_journal_max_payload_bytes", false)(
+        "rbd_journal_max_concurrent_object_sets", false);
 
     md_config_t local_config_t;
     std::map<std::string, bufferlist> res;
@@ -985,6 +986,7 @@ struct C_InvalidateCache : public Context {
     ASSIGN_OPTION(journal_object_flush_age);
     ASSIGN_OPTION(journal_pool);
     ASSIGN_OPTION(journal_max_payload_bytes);
+    ASSIGN_OPTION(journal_max_concurrent_object_sets);
   }
 
   ExclusiveLock<ImageCtx> *ImageCtx::create_exclusive_lock() {
index 7660f6e55467d900dc07888d83a658a08b603af2..552d8a8eb5d27d7401f444f084ce32ba63dc2dca 100644 (file)
@@ -183,6 +183,7 @@ namespace librbd {
     double journal_object_flush_age;
     std::string journal_pool;
     uint32_t journal_max_payload_bytes;
+    int journal_max_concurrent_object_sets;
 
     LibrbdAdminSocketHook *asok_hook;
 
index f98977bac6dd94a644bf017463a384421bad23a4..af44f00752cb0696ea1a9aecd21b8b5d586aab0e 100644 (file)
@@ -1201,6 +1201,11 @@ void Journal<I>::create_journaler() {
   ::journal::Settings settings;
   settings.commit_interval = m_image_ctx.journal_commit_age;
   settings.max_payload_bytes = m_image_ctx.journal_max_payload_bytes;
+  settings.max_concurrent_object_sets =
+    m_image_ctx.journal_max_concurrent_object_sets;
+  // TODO: a configurable filter to exclude certain peers from being
+  // disconnected.
+  settings.whitelisted_laggy_clients = {IMAGE_CLIENT_ID};
 
   m_journaler = new Journaler(m_work_queue, m_timer, m_timer_lock,
                              m_image_ctx.md_ctx, m_image_ctx.id,
index ae0f3d67fbdcad7cd742d084a736190cdd61f251..3dd3962d169ffbd01196cbb9c22c62d912a3b4c1 100644 (file)
@@ -91,7 +91,9 @@ struct MockImageCtx {
       journal_object_flush_bytes(image_ctx.journal_object_flush_bytes),
       journal_object_flush_age(image_ctx.journal_object_flush_age),
       journal_pool(image_ctx.journal_pool),
-      journal_max_payload_bytes(image_ctx.journal_max_payload_bytes)
+      journal_max_payload_bytes(image_ctx.journal_max_payload_bytes),
+      journal_max_concurrent_object_sets(
+          image_ctx.journal_max_concurrent_object_sets)
   {
     md_ctx.dup(image_ctx.md_ctx);
     data_ctx.dup(image_ctx.data_ctx);
@@ -257,6 +259,7 @@ struct MockImageCtx {
   double journal_object_flush_age;
   std::string journal_pool;
   uint32_t journal_max_payload_bytes;
+  int journal_max_concurrent_object_sets;
 };
 
 } // namespace librbd