]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cls_rbd: return negative pool id if parent does not exist
authorJosh Durgin <josh.durgin@inktank.com>
Mon, 9 Jul 2012 09:15:28 +0000 (02:15 -0700)
committerJosh Durgin <josh.durgin@inktank.com>
Mon, 23 Jul 2012 16:55:42 +0000 (09:55 -0700)
This lets us use get_parent in a multi-op transaction without getting
-ENOENT for the entire transaction.

Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
src/cls_rbd.cc
src/test/rbd/test_cls_rbd.cc

index 7f1a0f32f5c7b7103bbb4ed4e9c767e31a496236..2ee1baef7723f5d237b9dd1f4a5dd0ea9afb2ca0 100644 (file)
@@ -704,12 +704,12 @@ int check_exists(cls_method_context_t hctx)
  * @param snap_id which snapshot to query, or CEPH_NOSNAP (uint64_t)
  *
  * Output:
- * @param pool parent pool id
+ * @param pool parent pool id (-1 if parent does not exist)
  * @param image parent image id
  * @param snapid parent snapid
  * @param size portion of parent mapped under the child
  *
- * @returns 0 on success, -ENOENT if no parent, other negative error code on failure
+ * @returns 0 on success or parent does not exist, negative error code on failure
  */
 int get_parent(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
 {
@@ -735,21 +735,18 @@ int get_parent(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
   cls_rbd_parent parent;
   if (snap_id == CEPH_NOSNAP) {
     r = read_key(hctx, "parent", &parent);
-    if (r < 0)
+    if (r < 0 && r != -ENOENT)
       return r;
   } else {
     cls_rbd_snap snap;
     string snapshot_key;
     key_from_snap_id(snap_id, &snapshot_key);
     r = read_key(hctx, snapshot_key, &snap);
-    if (r < 0)
+    if (r < 0 && r != -ENOENT)
       return r;
     parent = snap.parent;
   }
 
-  if (!parent.exists())
-    return -ENOENT;
-
   ::encode(parent.pool, *out);
   ::encode(parent.id, *out);
   ::encode(parent.snapid, *out);
index 57c490584606fbd1bd7366426578af586addb986..0f870cfb8e9e497d7f8a5fbffd5be545896db7f1 100644 (file)
@@ -442,8 +442,10 @@ TEST(cls_rbd, parents)
   // new image will work
   ASSERT_EQ(0, create_image(&ioctx, "foo", 33<<20, 22, RBD_FEATURE_LAYERING, "foo."));
 
-  ASSERT_EQ(-ENOENT, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
-  ASSERT_EQ(-ENOENT, get_parent(&ioctx, "foo", 123, &pool, &parent, &snapid, &size));
+  ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
+  ASSERT_EQ(-1, pool);
+  ASSERT_EQ(0, get_parent(&ioctx, "foo", 123, &pool, &parent, &snapid, &size));
+  ASSERT_EQ(-1, pool);
 
   ASSERT_EQ(-EINVAL, set_parent(&ioctx, "foo", -1, "parent", 3, 10<<20));
   ASSERT_EQ(-EINVAL, set_parent(&ioctx, "foo", 1, "", 3, 10<<20));
@@ -461,7 +463,8 @@ TEST(cls_rbd, parents)
 
   ASSERT_EQ(0, remove_parent(&ioctx, "foo"));
   ASSERT_EQ(-ENOENT, remove_parent(&ioctx, "foo"));
-  ASSERT_EQ(-ENOENT, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
+  ASSERT_EQ(0, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
+  ASSERT_EQ(-1, pool);
 
   // snapshots
   ASSERT_EQ(0, set_parent(&ioctx, "foo", 1, "parent", 3, 10<<20));
@@ -498,7 +501,8 @@ TEST(cls_rbd, parents)
   ASSERT_EQ(parent, "parent2");
   ASSERT_EQ(snapid, snapid_t(6));
   ASSERT_EQ(size, 5ull<<20);
-  ASSERT_EQ(-ENOENT, get_parent(&ioctx, "foo", 12, &pool, &parent, &snapid, &size));
+  ASSERT_EQ(0, get_parent(&ioctx, "foo", 12, &pool, &parent, &snapid, &size));
+  ASSERT_EQ(-1, pool);
 
   // make sure set_parent takes min of our size and parent's size
   ASSERT_EQ(0, set_parent(&ioctx, "foo", 1, "parent", 3, 1<<20));