]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: implement image.snap_exists()
authorSage Weil <sage@inktank.com>
Fri, 29 Mar 2013 04:17:21 +0000 (21:17 -0700)
committerJosh Durgin <josh.durgin@inktank.com>
Mon, 1 Apr 2013 06:32:41 +0000 (23:32 -0700)
This is a much more convenient way to tell if a snapshot already exists.

Signed-off-by: Sage Weil <sage@inktank.com>
src/include/rbd/librbd.hpp
src/librbd/internal.cc
src/librbd/internal.h
src/librbd/librbd.cc
src/test/librbd/test_librbd.cc

index bf331d5e69edfbab4630811bddbe7eb119078436..d061bdbe4eb867012083b9e6bcde9ed9399c6eaa 100644 (file)
@@ -142,6 +142,7 @@ public:
 
   /* snapshots */
   int snap_list(std::vector<snap_info_t>& snaps);
+  bool snap_exists(const char *snapname);
   int snap_create(const char *snapname);
   int snap_remove(const char *snapname);
   int snap_rollback(const char *snap_name);
index a7812e6c611ff7379ca3a45688a183af4e00cc5a..4daa5b801db3ddd427efcd847e7395567d144379 100644 (file)
@@ -1462,6 +1462,19 @@ reprotect_and_return_err:
     return 0;
   }
 
+  bool snap_exists(ImageCtx *ictx, const char *snap_name)
+  {
+    ldout(ictx->cct, 20) << "snap_exists " << ictx << " " << snap_name << dendl;
+
+    int r = ictx_check(ictx);
+    if (r < 0)
+      return r;
+
+    RWLock::RLocker l(ictx->snap_lock);
+    return ictx->snaps_by_name.count(snap_name);
+  }
+
+
   int add_snap(ImageCtx *ictx, const char *snap_name)
   {
     uint64_t snap_id;
index b78155afdaef9daedb1306f5e2cb0273853204b6..e0ea13ba496a29858105b31b17005425f8228880 100644 (file)
@@ -102,6 +102,7 @@ namespace librbd {
   int resize_helper(ImageCtx *ictx, uint64_t size, ProgressContext& prog_ctx);
   int snap_create(ImageCtx *ictx, const char *snap_name);
   int snap_list(ImageCtx *ictx, std::vector<snap_info_t>& snaps);
+  bool snap_list(ImageCtx *ictx, const char *snap_name);
   int snap_rollback(ImageCtx *ictx, const char *snap_name,
                    ProgressContext& prog_ctx);
   int snap_remove(ImageCtx *ictx, const char *snap_name);
index 06e4a6e23fc6c5fde48a81a763e410715a04b3a6..b522288b6a7d97bf600fef71142ce1c661cfb681 100644 (file)
@@ -414,6 +414,12 @@ namespace librbd {
     return librbd::snap_list(ictx, snaps);
   }
 
+  bool Image::snap_exists(const char *snap_name)
+  {
+    ImageCtx *ictx = (ImageCtx *)ctx;
+    return librbd::snap_exists(ictx, snap_name);
+  }
+
   int Image::snap_set(const char *snap_name)
   {
     ImageCtx *ictx = (ImageCtx *)ctx;
index 9ae72c704a2ecf8ab55c20dabb571f70db78274c..ff083ae817f4846b24a1e5e171ee3961ffcdec5a 100644 (file)
@@ -566,14 +566,20 @@ TEST(LibRBD, TestCreateLsDeleteSnapPP)
     ASSERT_EQ(0, create_image_pp(rbd, ioctx, name, size, &order));
     ASSERT_EQ(0, rbd.open(ioctx, image, name, NULL));
 
+    ASSERT_FALSE(image.snap_exists("snap1"));
     ASSERT_EQ(0, image.snap_create("snap1"));
+    ASSERT_TRUE(image.snap_exists("snap1"));
     ASSERT_EQ(1, test_ls_snaps(image, 1, "snap1", size));
     ASSERT_EQ(0, image.resize(size2));
+    ASSERT_FALSE(image.snap_exists("snap2"));
     ASSERT_EQ(0, image.snap_create("snap2"));
+    ASSERT_TRUE(image.snap_exists("snap2"));
     ASSERT_EQ(2, test_ls_snaps(image, 2, "snap1", size, "snap2", size2));
     ASSERT_EQ(0, image.snap_remove("snap1"));
+    ASSERT_FALSE(image.snap_exists("snap1"));
     ASSERT_EQ(1, test_ls_snaps(image, 1, "snap2", size2));
     ASSERT_EQ(0, image.snap_remove("snap2"));
+    ASSERT_FALSE(image.snap_exists("snap2"));
     ASSERT_EQ(0, test_ls_snaps(image, 0));
   }