]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mon/OSDMonitor: make snap removal handle dups safely
authorSage Weil <sage@redhat.com>
Mon, 17 Jun 2019 23:11:50 +0000 (18:11 -0500)
committerSage Weil <sage@redhat.com>
Tue, 2 Jul 2019 13:37:49 +0000 (08:37 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h
src/osd/OSDMap.h

index 675c756d18a0db98cf1ef48f812ca2c4d699ccd5..72298fd70434e7677888028eff2a79db7bfb5534 100644 (file)
@@ -12679,6 +12679,21 @@ bool OSDMonitor::_is_removed_snap(int64_t pool, snapid_t snap)
   return false;
 }
 
+bool OSDMonitor::_is_pending_removed_snap(int64_t pool, snapid_t snap)
+{
+  if (pending_inc.old_pools.count(pool)) {
+    dout(10) << __func__ << " pool " << pool << " snap " << snap
+            << " - pool pending deletion" << dendl;
+    return true;
+  }
+  if (pending_inc.in_new_removed_snaps(pool, snap)) {
+    dout(10) << __func__ << " pool " << pool << " snap " << snap
+            << " - in pending new_removed_snaps" << dendl;
+    return true;
+  }
+  return false;
+}
+
 bool OSDMonitor::preprocess_pool_op_create(MonOpRequestRef op)
 {
   op->mark_osdmon_event(__func__);
@@ -12810,7 +12825,8 @@ bool OSDMonitor::prepare_pool_op(MonOpRequestRef op)
     break;
 
   case POOL_OP_DELETE_UNMANAGED_SNAP:
-    if (!_is_removed_snap(m->pool, m->snapid)) {
+    if (!_is_removed_snap(m->pool, m->snapid) &&
+       !_is_pending_removed_snap(m->pool, m->snapid)) {
       if (m->snapid > pp.get_snap_seq()) {
         _pool_op_reply(op, -ENOENT, osdmap.get_epoch());
         return false;
index debe4be19ebbf4a51892d8bce96e1850b47877b9..676eaba80e2b0af71e63efd11e01598dea1c3946 100644 (file)
@@ -502,6 +502,7 @@ private:
   bool update_pools_status();
 
   bool _is_removed_snap(int64_t pool_id, snapid_t snapid);
+  bool _is_pending_removed_snap(int64_t pool_id, snapid_t snapid);
 
   string make_snap_epoch_key(int64_t pool, epoch_t epoch);
   string make_snap_key(int64_t pool, snapid_t snap);
index fa6c2949b424526b45ca15ca764376df81c0a6ab..b87ec8dc3c69a6acd8218e2be3652c8603cdaafc 100644 (file)
@@ -499,6 +499,13 @@ public:
       return true;
     }
 
+    bool in_new_removed_snaps(int64_t pool, snapid_t snap) const {
+      auto p = new_removed_snaps.find(pool);
+      if (p == new_removed_snaps.end()) {
+       return false;
+      }
+      return p->second.contains(snap);
+    }
   };
   
 private: