From: Sage Weil Date: Thu, 30 May 2019 14:49:06 +0000 (-0500) Subject: mon/OSDMonitor: avoid is_removed_snap() X-Git-Tag: v15.1.0~2308^2~63 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3f9c28823aafc6b970eefba1455a26df98563536;p=ceph.git mon/OSDMonitor: avoid is_removed_snap() Instead, consult the OSDMap's removed_snap_queue and the mon's record of purged snaps. Signed-off-by: Sage Weil --- diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index fc5ed8c57e3a..d380332312f2 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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; diff --git a/src/mon/OSDMonitor.h b/src/mon/OSDMonitor.h index 12d005120674..debe4be19ebb 100644 --- a/src/mon/OSDMonitor.h +++ b/src/mon/OSDMonitor.h @@ -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, diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index 31db41aecd7a..fa6c2949b424 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -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& get_removed_snaps_queue() const { return removed_snaps_queue;