]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: avoid is_removed_snap()
authorSage Weil <sage@redhat.com>
Thu, 30 May 2019 14:49:06 +0000 (09:49 -0500)
committerSage Weil <sage@redhat.com>
Tue, 2 Jul 2019 13:37:48 +0000 (08:37 -0500)
Instead, consult the OSDMap's removed_snap_queue and the mon's record of
purged snaps.

Signed-off-by: Sage Weil <sage@redhat.com>
src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h
src/osd/OSDMap.h

index fc5ed8c57e3ada4ec1001f9e3e644845c95cf3d8..d380332312f23dc0e2d9a13b4cc928b51af9361a 100644 (file)
@@ -3556,7 +3556,8 @@ bool OSDMonitor::preprocess_remove_snaps(MonOpRequestRef op)
        q != m->snaps.end();
        ++q) {
     if (!osdmap.have_pg_pool(q->first)) {
-      dout(10) << " ignoring removed_snaps " << q->second << " on non-existent pool " << q->first << dendl;
+      dout(10) << " ignoring removed_snaps " << q->second
+              << " on non-existent pool " << q->first << dendl;
       continue;
     }
     const pg_pool_t *pi = osdmap.get_pg_pool(q->first);
@@ -3564,8 +3565,9 @@ bool OSDMonitor::preprocess_remove_snaps(MonOpRequestRef op)
         p != q->second.end();
         ++p) {
       if (*p > pi->get_snap_seq() ||
-         !pi->removed_snaps.contains(*p))
+         !_is_removed_snap(q->first, *p)) {
        return false;
+      }
     }
   }
 
@@ -12613,7 +12615,7 @@ bool OSDMonitor::preprocess_pool_op(MonOpRequestRef op)
       _pool_op_reply(op, -EINVAL, osdmap.get_epoch());
       return true;
     }
-    if (p->is_removed_snap(m->snapid)) {
+    if (_is_removed_snap(m->pool, m->snapid)) {
       _pool_op_reply(op, 0, osdmap.get_epoch());
       return true;
     }
@@ -12634,6 +12636,28 @@ bool OSDMonitor::preprocess_pool_op(MonOpRequestRef op)
   return false;
 }
 
+bool OSDMonitor::_is_removed_snap(int64_t pool, snapid_t snap)
+{
+  if (!osdmap.have_pg_pool(pool)) {
+    dout(10) << __func__ << " pool " << pool << " snap " << snap
+            << " - pool dne" << dendl;
+    return true;
+  }
+  if (osdmap.in_removed_snaps_queue(pool, snap)) {
+    dout(10) << __func__ << " pool " << pool << " snap " << snap
+            << " - in osdmap removed_snaps_queue" << dendl;
+    return true;
+  }
+  snapid_t begin, end;
+  int r = lookup_pruned_snap(pool, snap, &begin, &end);
+  if (r == 0) {
+    dout(10) << __func__ << " pool " << pool << " snap " << snap
+            << " - purged, [" << begin << "," << end << ")" << dendl;
+    return true;
+  }
+  return false;
+}
+
 bool OSDMonitor::preprocess_pool_op_create(MonOpRequestRef op)
 {
   op->mark_osdmon_event(__func__);
@@ -12765,7 +12789,7 @@ bool OSDMonitor::prepare_pool_op(MonOpRequestRef op)
     break;
 
   case POOL_OP_DELETE_UNMANAGED_SNAP:
-    if (!pp.is_removed_snap(m->snapid)) {
+    if (!_is_removed_snap(m->pool, m->snapid)) {
       if (m->snapid > pp.get_snap_seq()) {
         _pool_op_reply(op, -ENOENT, osdmap.get_epoch());
         return false;
index 12d005120674e3394878851ba8bcb96aaedc2f3a..debe4be19ebbf4a51892d8bce96e1850b47877b9 100644 (file)
@@ -501,6 +501,8 @@ private:
   void clear_pool_flags(int64_t pool_id, uint64_t flags);
   bool update_pools_status();
 
+  bool _is_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);
   string make_snap_key_value(int64_t pool, snapid_t snap, snapid_t num,
index 31db41aecd7a6e6b4f4acfa8090c6c7fea85d038..fa6c2949b424526b45ca15ca764376df81c0a6ab 100644 (file)
@@ -1261,6 +1261,14 @@ public:
     return false;
   }
 
+  bool in_removed_snaps_queue(int64_t pool, snapid_t snap) const {
+    auto p = removed_snaps_queue.find(pool);
+    if (p == removed_snaps_queue.end()) {
+      return false;
+    }
+    return p->second.contains(snap);
+  }
+
   const mempool::osdmap::map<int64_t,snap_interval_set_t>&
   get_removed_snaps_queue() const {
     return removed_snaps_queue;