]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librbd: ChildImageSpec now optionally includes child pool namespace
authorJason Dillaman <dillaman@redhat.com>
Fri, 27 Jul 2018 14:44:41 +0000 (10:44 -0400)
committerJason Dillaman <dillaman@redhat.com>
Wed, 19 Sep 2018 12:04:12 +0000 (08:04 -0400)
It will break version compatibility if used against older OSDs that
don't support RBD pool namespace support.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/cls/rbd/cls_rbd_types.cc
src/cls/rbd/cls_rbd_types.h
src/librbd/image/CloneRequest.cc
src/librbd/image/DetachChildRequest.cc
src/test/cls_rbd/test_cls_rbd.cc
src/test/librbd/image/test_mock_CloneRequest.cc
src/test/librbd/image/test_mock_DetachChildRequest.cc

index 24d63d72d8d89edfd70a6659b4e61a793f115b6a..fc733bb6f223199de57f13cccbb6014f2d75fe58 100644 (file)
@@ -244,27 +244,33 @@ void ParentImageSpec::generate_test_instances(std::list<ParentImageSpec*>& o) {
 }
 
 void ChildImageSpec::encode(bufferlist &bl) const {
-  ENCODE_START(1, 1, bl);
+  ENCODE_START(2, 1, bl);
   encode(pool_id, bl);
   encode(image_id, bl);
+  encode(pool_namespace, bl);
   ENCODE_FINISH(bl);
 }
 
 void ChildImageSpec::decode(bufferlist::const_iterator &it) {
-  DECODE_START(1, it);
+  DECODE_START(2, it);
   decode(pool_id, it);
   decode(image_id, it);
+  if (struct_v >= 2) {
+    decode(pool_namespace, it);
+  }
   DECODE_FINISH(it);
 }
 
 void ChildImageSpec::dump(Formatter *f) const {
   f->dump_int("pool_id", pool_id);
+  f->dump_string("pool_namespace", pool_namespace);
   f->dump_string("image_id", image_id);
 }
 
 void ChildImageSpec::generate_test_instances(std::list<ChildImageSpec*> &o) {
   o.push_back(new ChildImageSpec());
-  o.push_back(new ChildImageSpec(123, "abc"));
+  o.push_back(new ChildImageSpec(123, "", "abc"));
+  o.push_back(new ChildImageSpec(123, "ns", "abc"));
 }
 
 void GroupImageSpec::encode(bufferlist &bl) const {
index 03fe4750f0f3a078ea5fb5a2dc28e42559c7aa9e..60042e6097969a3870d719cd095bc59c828cc92f 100644 (file)
@@ -221,11 +221,13 @@ WRITE_CLASS_ENCODER(ParentImageSpec);
 
 struct ChildImageSpec {
   int64_t pool_id = -1;
+  std::string pool_namespace;
   std::string image_id;
 
   ChildImageSpec() {}
-  ChildImageSpec(int64_t pool_id, const std::string& image_id)
-    : pool_id(pool_id), image_id(image_id) {
+  ChildImageSpec(int64_t pool_id, const std::string& pool_namespace,
+                 const std::string& image_id)
+    : pool_id(pool_id), pool_namespace(pool_namespace), image_id(image_id) {
   }
 
   void encode(bufferlist &bl) const;
@@ -236,12 +238,16 @@ struct ChildImageSpec {
 
   inline bool operator==(const ChildImageSpec& rhs) const {
     return (pool_id == rhs.pool_id &&
+            pool_namespace == rhs.pool_namespace &&
             image_id == rhs.image_id);
   }
   inline bool operator<(const ChildImageSpec& rhs) const {
     if (pool_id != rhs.pool_id) {
       return pool_id < rhs.pool_id;
     }
+    if (pool_namespace != rhs.pool_namespace) {
+      return pool_namespace < rhs.pool_namespace;
+    }
     return image_id < rhs.image_id;
   }
 };
index 1889481ba9889fe801d4d1f5a7a17c30cc8a4309..818f2354994a39c76424d35c9372957faebb2da8 100644 (file)
@@ -388,7 +388,9 @@ void CloneRequest<I>::v2_child_attach() {
 
   librados::ObjectWriteOperation op;
   cls_client::child_attach(&op, m_parent_image_ctx->snap_id,
-                           {m_imctx->md_ctx.get_id(), m_imctx->id});
+                           {m_imctx->md_ctx.get_id(),
+                            m_imctx->md_ctx.get_namespace(),
+                            m_imctx->id});
 
   auto aio_comp = create_rados_callback<
     CloneRequest<I>, &CloneRequest<I>::handle_v2_child_attach>(this);
index b91cc0d19d04b8bffa80714a7a8523f62ce96fa6..d29c575cb510341ad6732b81811fbc970e267194 100644 (file)
@@ -63,7 +63,9 @@ void DetachChildRequest<I>::clone_v2_child_detach() {
 
   librados::ObjectWriteOperation op;
   cls_client::child_detach(&op, m_parent_spec.snap_id,
-                           {m_image_ctx.md_ctx.get_id(), m_image_ctx.id});
+                           {m_image_ctx.md_ctx.get_id(),
+                            m_image_ctx.md_ctx.get_namespace(),
+                            m_image_ctx.id});
 
   librados::Rados rados(m_image_ctx.md_ctx);
   int r = rados.ioctx_create2(m_parent_spec.pool_id, m_parent_io_ctx);
index c03c4dfd81446180a7602046daeee12afe13de3a..5723988cd2d434e31aad968fb679e031fb7002ae 100644 (file)
@@ -2500,10 +2500,10 @@ TEST_F(TestClsRbd, clone_parent)
   ASSERT_EQ(-ENOENT, child_detach(&ioctx, oid, 123, {}));
   ASSERT_EQ(-ENOENT, child_detach(&ioctx, oid, 345, {}));
 
-  ASSERT_EQ(0, child_attach(&ioctx, oid, 123, {1, "image1"}));
-  ASSERT_EQ(-EEXIST, child_attach(&ioctx, oid, 123, {1, "image1"}));
-  ASSERT_EQ(0, child_attach(&ioctx, oid, 123, {1, "image2"}));
-  ASSERT_EQ(0, child_attach(&ioctx, oid, 123, {2, "image2"}));
+  ASSERT_EQ(0, child_attach(&ioctx, oid, 123, {1, "", "image1"}));
+  ASSERT_EQ(-EEXIST, child_attach(&ioctx, oid, 123, {1, "", "image1"}));
+  ASSERT_EQ(0, child_attach(&ioctx, oid, 123, {1, "", "image2"}));
+  ASSERT_EQ(0, child_attach(&ioctx, oid, 123, {2, "", "image2"}));
 
   cls::rbd::SnapshotInfo snap;
   ASSERT_EQ(0, snapshot_get(&ioctx, oid, 123, &snap));
@@ -2529,7 +2529,7 @@ TEST_F(TestClsRbd, clone_parent)
   ASSERT_EQ(0, children_list(&ioctx, oid, 123, &child_images));
 
   cls::rbd::ChildImageSpecs expected_child_images = {
-    {1, "image1"}, {1, "image2"}, {2, "image2"}};
+    {1, "", "image1"}, {1, "", "image2"}, {2, "", "image2"}};
   ASSERT_EQ(expected_child_images, child_images);
 
   // move snapshot to the trash
@@ -2545,17 +2545,17 @@ TEST_F(TestClsRbd, clone_parent)
   ASSERT_EQ(0, op_features_get(&ioctx, oid, &op_features));
   ASSERT_TRUE((op_features & expected_op_features) == expected_op_features);
 
-  expected_child_images = {{1, "image1"}, {2, "image2"}};
-  ASSERT_EQ(0, child_detach(&ioctx, oid, 123, {1, "image2"}));
+  expected_child_images = {{1, "", "image1"}, {2, "", "image2"}};
+  ASSERT_EQ(0, child_detach(&ioctx, oid, 123, {1, "", "image2"}));
   ASSERT_EQ(0, children_list(&ioctx, oid, 123, &child_images));
   ASSERT_EQ(expected_child_images, child_images);
 
-  ASSERT_EQ(0, child_detach(&ioctx, oid, 123, {2, "image2"}));
+  ASSERT_EQ(0, child_detach(&ioctx, oid, 123, {2, "", "image2"}));
 
   ASSERT_EQ(0, op_features_get(&ioctx, oid, &op_features));
   ASSERT_TRUE((op_features & expected_op_features) == expected_op_features);
 
-  ASSERT_EQ(0, child_detach(&ioctx, oid, 123, {1, "image1"}));
+  ASSERT_EQ(0, child_detach(&ioctx, oid, 123, {1, "", "image1"}));
   ASSERT_EQ(-ENOENT, children_list(&ioctx, oid, 123, &child_images));
 
   ASSERT_EQ(0, snapshot_remove(&ioctx, oid, 234));
@@ -2568,6 +2568,37 @@ TEST_F(TestClsRbd, clone_parent)
   ASSERT_TRUE((op_features & expected_op_features) == 0);
 }
 
+TEST_F(TestClsRbd, clone_parent_ns)
+{
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
+
+  string oid = get_temp_image_name();
+  ASSERT_EQ(0, create_image(&ioctx, oid, 0, 22, 0, oid, -1));
+  ASSERT_EQ(0, snapshot_add(&ioctx, oid, 123, "user_snap"));
+
+  ASSERT_EQ(0, child_attach(&ioctx, oid, 123, {1, "ns1", "image1"}));
+  ASSERT_EQ(-EEXIST, child_attach(&ioctx, oid, 123, {1, "ns1", "image1"}));
+  ASSERT_EQ(0, child_attach(&ioctx, oid, 123, {1, "ns2", "image1"}));
+
+  cls::rbd::ChildImageSpecs child_images;
+  ASSERT_EQ(0, children_list(&ioctx, oid, 123, &child_images));
+
+  cls::rbd::ChildImageSpecs expected_child_images = {
+    {1, "ns1", "image1"}, {1, "ns2", "image1"}};
+  ASSERT_EQ(expected_child_images, child_images);
+
+  expected_child_images = {{1, "ns1", "image1"}};
+  ASSERT_EQ(0, child_detach(&ioctx, oid, 123, {1, "ns2", "image1"}));
+  ASSERT_EQ(0, children_list(&ioctx, oid, 123, &child_images));
+  ASSERT_EQ(expected_child_images, child_images);
+
+  ASSERT_EQ(0, child_detach(&ioctx, oid, 123, {1, "ns1", "image1"}));
+  ASSERT_EQ(-ENOENT, children_list(&ioctx, oid, 123, &child_images));
+
+  ASSERT_EQ(0, snapshot_remove(&ioctx, oid, 123));
+}
+
 TEST_F(TestClsRbd, clone_child)
 {
   librados::IoCtx ioctx;
index d892b70dad9bb3a12cfe2116d934996f18d93cc5..94b89265d72e68e4c16ce936b03fb8305dceb46a 100644 (file)
@@ -260,7 +260,8 @@ public:
   void expect_child_attach(MockImageCtx &mock_image_ctx, int r) {
     bufferlist bl;
     encode(mock_image_ctx.snap_id, bl);
-    encode(cls::rbd::ChildImageSpec{m_ioctx.get_id(), mock_image_ctx.id}, bl);
+    encode(cls::rbd::ChildImageSpec{m_ioctx.get_id(), "", mock_image_ctx.id},
+           bl);
 
     EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx),
                 exec(mock_image_ctx.header_oid, _, StrEq("rbd"),
index 2fea0b461f8546cb1b56505709927af328ba69a1..58c6378ac1e93e2b48352c44e73a0924a63faea6 100644 (file)
@@ -81,7 +81,7 @@ public:
 
     bufferlist bl;
     encode(parent_spec.snap_id, bl);
-    encode(cls::rbd::ChildImageSpec{mock_image_ctx.md_ctx.get_id(),
+    encode(cls::rbd::ChildImageSpec{mock_image_ctx.md_ctx.get_id(), "",
                                     mock_image_ctx.id}, bl);
 
     EXPECT_CALL(mock_io_ctx_impl,