]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: introduce LIST_WATCHERS_MIRROR_INSTANCES_ONLY flag
authorMykola Golub <mgolub@suse.com>
Wed, 4 Dec 2019 09:31:48 +0000 (09:31 +0000)
committerMykola Golub <mgolub@suse.com>
Tue, 10 Dec 2019 15:45:30 +0000 (15:45 +0000)
Also, don't skip listing mirror watchers if the image has journaling
disabled -- it is not correct for snapshot mirror mode.

Signed-off-by: Mykola Golub <mgolub@suse.com>
src/librbd/image/ListWatchersRequest.cc
src/librbd/image/ListWatchersRequest.h

index 594c14445ee9d084aba7575746f9ac50424ba6e4..05ae8d1a90e13e83f3103ffab8afcc912b84014e 100644 (file)
@@ -29,6 +29,8 @@ ListWatchersRequest<I>::ListWatchersRequest(I &image_ctx, int flags,
                                             Context *on_finish)
   : m_image_ctx(image_ctx), m_flags(flags), m_watchers(watchers),
     m_on_finish(on_finish), m_cct(m_image_ctx.cct) {
+  ceph_assert((m_flags & LIST_WATCHERS_FILTER_OUT_MIRROR_INSTANCES) == 0 ||
+              (m_flags & LIST_WATCHERS_MIRROR_INSTANCES_ONLY) == 0);
 }
 
 template<typename I>
@@ -75,8 +77,8 @@ void ListWatchersRequest<I>::handle_list_image_watchers(int r) {
 template<typename I>
 void ListWatchersRequest<I>::list_mirror_watchers() {
   if ((m_object_watchers.empty()) ||
-      (m_flags & LIST_WATCHERS_FILTER_OUT_MIRROR_INSTANCES) == 0 ||
-      (m_image_ctx.features & RBD_FEATURE_JOURNALING) == 0) {
+      (m_flags & (LIST_WATCHERS_FILTER_OUT_MIRROR_INSTANCES |
+                  LIST_WATCHERS_MIRROR_INSTANCES_ONLY)) == 0) {
     finish(0);
     return;
   }
@@ -128,16 +130,20 @@ void ListWatchersRequest<I>::finish(int r) {
             continue;
           }
         }
+        auto it = std::find_if(m_mirror_watchers.begin(),
+                               m_mirror_watchers.end(),
+                               [w] (obj_watch_t &watcher) {
+                                 return (strncmp(w.addr, watcher.addr,
+                                                 sizeof(w.addr)) == 0);
+                               });
         if ((m_flags & LIST_WATCHERS_FILTER_OUT_MIRROR_INSTANCES) != 0) {
-          auto it = std::find_if(m_mirror_watchers.begin(),
-                                 m_mirror_watchers.end(),
-                                 [w] (obj_watch_t &watcher) {
-                                   return (strncmp(w.addr, watcher.addr,
-                                                   sizeof(w.addr)) == 0);
-                                 });
           if (it != m_mirror_watchers.end()) {
             continue;
           }
+        } else if ((m_flags & LIST_WATCHERS_MIRROR_INSTANCES_ONLY) != 0) {
+          if (it == m_mirror_watchers.end()) {
+            continue;
+          }
         }
         m_watchers->push_back(w);
       }
index 941bf728ad6fb9fd6530c1e29559973736ad4112..2c77254a7c0b5e55f0f7768144df38f8a0fa35b6 100644 (file)
@@ -19,6 +19,7 @@ namespace image {
 enum {
   LIST_WATCHERS_FILTER_OUT_MY_INSTANCE = 1 << 0,
   LIST_WATCHERS_FILTER_OUT_MIRROR_INSTANCES = 1 << 1,
+  LIST_WATCHERS_MIRROR_INSTANCES_ONLY = 1 << 3,
 };
 
 template<typename ImageCtxT = ImageCtx>