From 5f3ef77df48cb10540ae606b5761ff38df861720 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 23 Jul 2012 16:04:00 -0700 Subject: [PATCH] mon: make pool snap creation ops idempotent Return 0 if the snap already exists, or is already deleted. Also, avoid updating the pg_pool if we are just waiting for the current round to commit. Signed-off-by: Sage Weil --- src/mon/OSDMonitor.cc | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 908f2c11fe265..3cb1372ee834e 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -2557,7 +2557,7 @@ bool OSDMonitor::preprocess_pool_op(MPoolOp *m) return true; } if (snap_exists) { - _pool_op_reply(m, -EEXIST, osdmap.get_epoch()); + _pool_op_reply(m, 0, osdmap.get_epoch()); return true; } return false; // continue processing @@ -2573,7 +2573,7 @@ bool OSDMonitor::preprocess_pool_op(MPoolOp *m) return true; } if (!snap_exists) { - _pool_op_reply(m, -ENOENT, osdmap.get_epoch()); + _pool_op_reply(m, 0, osdmap.get_epoch()); return true; } return false; @@ -2582,6 +2582,10 @@ bool OSDMonitor::preprocess_pool_op(MPoolOp *m) _pool_op_reply(m, -EINVAL, osdmap.get_epoch()); return true; } + if (p->is_removed_snap(m->snapid)) { + _pool_op_reply(m, 0, osdmap.get_epoch()); + return true; + } return false; case POOL_OP_DELETE: //can't delete except on master if (osdmap.lookup_pg_pool_name(m->name.c_str()) >= 0) { @@ -2637,6 +2641,7 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m) bufferlist *blp = NULL; int ret = 0; + bool changed = false; // projected pool info pg_pool_t pp; @@ -2665,21 +2670,20 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m) switch (m->op) { case POOL_OP_CREATE_SNAP: - if (pp.snap_exists(m->name.c_str())) - ret = -EEXIST; - else { + if (!pp.snap_exists(m->name.c_str())) { pp.add_snap(m->name.c_str(), ceph_clock_now(g_ceph_context)); dout(10) << "create snap in pool " << m->pool << " " << m->name << " seq " << pp.get_snap_epoch() << dendl; + changed = true; } break; case POOL_OP_DELETE_SNAP: { snapid_t s = pp.snap_exists(m->name.c_str()); - if (s) + if (s) { pp.remove_snap(s); - else - ret = -ENOENT; + changed = true; + } } break; @@ -2689,14 +2693,15 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m) uint64_t snapid; pp.add_unmanaged_snap(snapid); ::encode(snapid, *blp); + changed = true; } break; case POOL_OP_DELETE_UNMANAGED_SNAP: - if (pp.is_removed_snap(m->snapid)) - ret = -ENOENT; - else + if (!pp.is_removed_snap(m->snapid)) { pp.remove_unmanaged_snap(m->snapid); + changed = true; + } break; default: @@ -2704,7 +2709,7 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m) break; } - if (ret == 0) { + if (changed) { pp.set_snap_epoch(pending_inc.epoch); pending_inc.new_pools[m->pool] = pp; } -- 2.39.5