From fa7655351c61d36b189131d7e3e8107605fdf54b Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 17 Jun 2019 18:11:50 -0500 Subject: [PATCH] mon/OSDMonitor: make snap removal handle dups safely Signed-off-by: Sage Weil --- src/mon/OSDMonitor.cc | 18 +++++++++++++++++- src/mon/OSDMonitor.h | 1 + src/osd/OSDMap.h | 7 +++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 675c756d18a..72298fd7043 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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; diff --git a/src/mon/OSDMonitor.h b/src/mon/OSDMonitor.h index debe4be19eb..676eaba80e2 100644 --- a/src/mon/OSDMonitor.h +++ b/src/mon/OSDMonitor.h @@ -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); diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index fa6c2949b42..b87ec8dc3c6 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -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: -- 2.39.5