From 0e85074402cd02b292daadcb5b8e73ac1207d571 Mon Sep 17 00:00:00 2001 From: Joao Eduardo Luis Date: Wed, 28 Aug 2013 18:01:34 +0100 Subject: [PATCH] mon: OSDMonitor: return earlier on no-ops over currently committed state Signed-off-by: Joao Eduardo Luis --- src/mon/OSDMonitor.cc | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index f56982bc7375e..695f2a0dc9943 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -3702,7 +3702,7 @@ bool OSDMonitor::preprocess_pool_op(MPoolOp *m) _pool_op_reply(m, 0, osdmap.get_epoch()); return true; } - + // check if the snap and snapname exists bool snap_exists = false; const pg_pool_t *p = osdmap.get_pg_pool(m->pool); @@ -3798,6 +3798,38 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m) int ret = 0; bool changed = false; + if (!osdmap.have_pg_pool(m->pool)) { + _pool_op_reply(m, -ENOENT, osdmap.get_epoch()); + return false; + } + + const pg_pool_t *pool = osdmap.get_pg_pool(m->pool); + + switch (m->op) { + case POOL_OP_CREATE_SNAP: + case POOL_OP_DELETE_SNAP: + if (!pool->is_unmanaged_snaps_mode()) { + bool snap_exists = pool->snap_exists(m->name.c_str()); + if ((m->op == POOL_OP_CREATE_SNAP && snap_exists) + || (m->op == POOL_OP_CREATE_SNAP && !snap_exists)) { + ret = 0; + } else { + break; + } + } else { + ret = -EINVAL; + } + _pool_op_reply(m, ret, osdmap.get_epoch()); + return false; + + case POOL_OP_CREATE_UNMANAGED_SNAP: + case POOL_OP_DELETE_UNMANAGED_SNAP: + if (pool->is_pool_snaps_mode()) { + _pool_op_reply(m, -EINVAL, osdmap.get_epoch()); + return false; + } + } + // projected pool info pg_pool_t pp; if (pending_inc.new_pools.count(m->pool)) @@ -3824,7 +3856,7 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m) goto out; } } - + switch (m->op) { case POOL_OP_CREATE_SNAP: if (!pp.snap_exists(m->name.c_str())) {