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);
p != q->second.end();
++p) {
if (*p > pi->get_snap_seq() ||
- !pi->removed_snaps.contains(*p))
+ !_is_removed_snap(q->first, *p)) {
return false;
+ }
}
}
_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;
}
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__);
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;
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,
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;