]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: fix ImageCtx::get_snap_id method
authorJason Dillaman <dillaman@redhat.com>
Thu, 11 Jan 2018 04:39:49 +0000 (23:39 -0500)
committerJason Dillaman <dillaman@redhat.com>
Thu, 11 Jan 2018 15:38:23 +0000 (10:38 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/ImageCtx.cc
src/librbd/ImageCtx.h
src/librbd/api/Group.cc

index 2078e5a265f7496d2f512e5a66b4873c53dad38d..6c26d490e49eeecb5a69d12aeaa7df887c974203 100644 (file)
@@ -466,12 +466,11 @@ struct C_InvalidateCache : public Context {
     data_ctx.snap_set_read(snap_id);
   }
 
-  snap_t ImageCtx::get_snap_id(cls::rbd::SnapshotNamespace in_snap_namespace,
-                              string in_snap_name) const
+  snap_t ImageCtx::get_snap_id(const cls::rbd::SnapshotNamespace& in_snap_namespace,
+                               const string& in_snap_name) const
   {
     assert(snap_lock.is_locked());
-    map<pair<cls::rbd::SnapshotNamespace, std::string>, snap_t>::const_iterator it =
-      snap_ids.lower_bound({in_snap_namespace, in_snap_name});
+    auto it = snap_ids.find({in_snap_namespace, in_snap_name});
     if (it != snap_ids.end()) {
       return it->second;
     }
index 41635fd4cb5ee851fb43181d531dd024d4dbb5f5..a7ec2989d720d04009c24aa2f8abe5281b17bf63 100644 (file)
@@ -241,8 +241,8 @@ namespace librbd {
     int snap_set(cls::rbd::SnapshotNamespace in_snap_namespace,
                 std::string in_snap_name);
     void snap_unset();
-    librados::snap_t get_snap_id(cls::rbd::SnapshotNamespace in_snap_namespace,
-                                std::string in_snap_name) const;
+    librados::snap_t get_snap_id(const cls::rbd::SnapshotNamespace& in_snap_namespace,
+                                 const std::string& in_snap_name) const;
     const SnapInfo* get_snap_info(librados::snap_t in_snap_id) const;
     int get_snap_name(librados::snap_t in_snap_id,
                      std::string *out_snap_name) const;
index 2e622a691054655733c59b2ca632d840ea34e81e..4c0b8ab2e9afd74a41f12f7234171645aebdd8f6 100644 (file)
@@ -33,6 +33,17 @@ namespace api {
 
 namespace {
 
+template <typename I>
+snap_t get_group_snap_id(I* ictx,
+                         const cls::rbd::SnapshotNamespace& in_snap_namespace) {
+  assert(ictx->snap_lock.is_locked());
+  auto it = ictx->snap_ids.lower_bound({in_snap_namespace, ""});
+  if (it != ictx->snap_ids.end() && it->first.first == in_snap_namespace) {
+    return it->second;
+  }
+  return CEPH_NOSNAP;
+}
+
 string generate_uuid(librados::IoCtx& io_ctx)
 {
   Rados rados(io_ctx);
@@ -204,7 +215,8 @@ int group_snap_remove_by_record(librados::IoCtx& group_ioctx,
   std::vector<librbd::IoCtx*> io_ctxs;
   std::vector<librbd::ImageCtx*> ictxs;
 
-  cls::rbd::SnapshotNamespace ne;
+  cls::rbd::GroupSnapshotNamespace ne{group_ioctx.get_id(), group_id,
+                                     group_snap.id};
 
   ldout(cct, 20) << "Removing snapshots" << dendl;
   int snap_count = group_snap.snaps.size();
@@ -241,10 +253,6 @@ int group_snap_remove_by_record(librados::IoCtx& group_ioctx,
     goto finish;
   }
 
-  ne = cls::rbd::GroupSnapshotNamespace(group_ioctx.get_id(),
-                                       group_id,
-                                       group_snap.id);
-
   ldout(cct, 20) << "Opened participating images. " <<
                    "Deleting snapshots themselves." << dendl;
 
@@ -254,7 +262,7 @@ int group_snap_remove_by_record(librados::IoCtx& group_ioctx,
 
     std::string snap_name;
     ictx->snap_lock.get_read();
-    snap_t snap_id = ictx->get_snap_id(ne, "");
+    snap_t snap_id = get_group_snap_id(ictx, ne);
     r = ictx->get_snap_name(snap_id, &snap_name);
     ictx->snap_lock.put_read();
 
@@ -666,8 +674,6 @@ int Group<I>::snap_create(librados::IoCtx& group_ioctx,
   std::vector<librbd::ImageCtx*> ictxs;
   std::vector<C_SaferCond*> on_finishes;
 
-  cls::rbd::SnapshotNamespace ne;
-
   int r = cls_client::dir_get_id(&group_ioctx, RBD_GROUP_DIRECTORY,
                                 group_name, &group_id);
   if (r < 0) {
@@ -701,6 +707,9 @@ int Group<I>::snap_create(librados::IoCtx& group_ioctx,
   group_snap.state = cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE;
   group_snap.snaps = image_snaps;
 
+  cls::rbd::GroupSnapshotNamespace ne{group_ioctx.get_id(), group_id,
+                                      group_snap.id};
+
   r = cls_client::group_snap_add(&group_ioctx, group_header_oid, group_snap);
   if (r == -EEXIST) {
     lderr(cct) << "snapshot with this name already exists: "
@@ -786,8 +795,6 @@ int Group<I>::snap_create(librados::IoCtx& group_ioctx,
 
   ind_snap_name = calc_ind_image_snap_name(group_ioctx.get_id(), group_id,
                                            group_snap.id);
-  ne = cls::rbd::GroupSnapshotNamespace(group_ioctx.get_id(), group_id,
-                                       group_snap.id);
 
   for (int i = 0; i < image_count; ++i) {
     ImageCtx *ictx = ictxs[i];
@@ -808,12 +815,11 @@ int Group<I>::snap_create(librados::IoCtx& group_ioctx,
     } else {
       ImageCtx *ictx = ictxs[i];
       ictx->snap_lock.get_read();
-      snap_t snap_id = ictx->get_snap_id(ne, "");
+      snap_t snap_id = get_group_snap_id(ictx, ne);
       ictx->snap_lock.put_read();
       if (snap_id == CEPH_NOSNAP) {
-       ldout(cct, 20) <<
-         "Couldn't find supposedly created snapshot with namespace: " <<
-         ne << dendl;
+       ldout(cct, 20) << "Couldn't find created snapshot with namespace: "
+                       << ne << dendl;
        ret_code = -ENOENT;
       } else {
        image_snaps[i].snap_id = snapid_t(snap_id);
@@ -847,7 +853,7 @@ remove_image_snaps:
     on_finishes[i] = new C_SaferCond;
     std::string snap_name;
     ictx->snap_lock.get_read();
-    snap_t snap_id = ictx->get_snap_id(ne, "");
+    snap_t snap_id = get_group_snap_id(ictx, ne);
     r = ictx->get_snap_name(snap_id, &snap_name);
     ictx->snap_lock.put_read();
     if (r >= 0) {