]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librbd: filter implicit features and non-user snapshots from image state
authorJason Dillaman <dillaman@redhat.com>
Fri, 21 Feb 2020 14:44:06 +0000 (09:44 -0500)
committerJason Dillaman <dillaman@redhat.com>
Fri, 21 Feb 2020 15:00:56 +0000 (10:00 -0500)
The implicit features are not controlled by the user so they should not
be mirrored. Similarly, trash snapshots are implicitly created by need
and group snapshots are not supported for mirroring.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/mirror/snapshot/SetImageStateRequest.cc
src/test/librbd/test_mirroring.cc

index 55c2df6298106fa914301433b366fa33b81bdf2e..1496e20ad4b23481126f9e007282c26a6b1e6231 100644 (file)
@@ -123,11 +123,14 @@ void SetImageStateRequest<I>::handle_get_metadata(int r) {
     std::shared_lock image_locker{m_image_ctx->image_lock};
 
     m_image_state.name = m_image_ctx->name;
-    m_image_state.features = m_image_ctx->features;
+    m_image_state.features =
+      m_image_ctx->features & ~RBD_FEATURES_IMPLICIT_ENABLE;
 
     for (auto &[snap_id, snap_info] : m_image_ctx->snap_info) {
       auto type = cls::rbd::get_snap_namespace_type(snap_info.snap_namespace);
-      if (type == cls::rbd::SNAPSHOT_NAMESPACE_TYPE_MIRROR) {
+      if (type != cls::rbd::SNAPSHOT_NAMESPACE_TYPE_USER) {
+        // only replicate user snapshots -- trash snapshots will be
+        // replicated by an implicit delete if required
         continue;
       }
       m_image_state.snapshots[snap_id] = {snap_info.snap_namespace,
index 199b5e23b8771de1491eafdb76f78c31ab7992aa..a3eacd75747b7f8426119b73b85acd9c41ad30fa 100644 (file)
@@ -1375,7 +1375,7 @@ TEST_F(TestMirroring, SnapshotImageState)
 
   ASSERT_EQ(image_name, image_state.name);
   ASSERT_EQ(0, image.features(&features));
-  ASSERT_EQ(features, image_state.features);
+  ASSERT_EQ(features & ~RBD_FEATURES_IMPLICIT_ENABLE, image_state.features);
   ASSERT_EQ(1U, image_state.snapshots.size());
   ASSERT_EQ("snap", image_state.snapshots.begin()->second.name);
   ASSERT_TRUE(image_state.metadata.empty());
@@ -1413,7 +1413,7 @@ TEST_F(TestMirroring, SnapshotImageState)
   }
 
   ASSERT_EQ(image_name, image_state.name);
-  ASSERT_EQ(features, image_state.features);
+  ASSERT_EQ(features & ~RBD_FEATURES_IMPLICIT_ENABLE, image_state.features);
   ASSERT_EQ(10U, image_state.metadata.size());
   for (int i = 0; i < 10; i++) {
     auto &bl = image_state.metadata[stringify(i)];