From d1501938f5d07c067d908501fc5cfe3c857d7281 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 16 Jul 2013 17:08:23 -0700 Subject: [PATCH] mon/OSDMonitor: make 'osd pool mksnap ...' not expose uncommitted state We were returning success without waiting if the pending pool state had the snap. Signed-off-by: Sage Weil Reviewed-by: Joao Eduardo Luis --- src/mon/OSDMonitor.cc | 47 +++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index dbd3db6240a..c8baac58c83 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -3316,30 +3316,33 @@ done: if (pool < 0) { ss << "unrecognized pool '" << poolstr << "'"; err = -ENOENT; + goto reply; + } + string snapname; + cmd_getval(g_ceph_context, cmdmap, "snap", snapname); + const pg_pool_t *p = osdmap.get_pg_pool(pool); + if (p->snap_exists(snapname.c_str())) { + ss << "pool " << poolstr << " snap " << snapname << " already exists"; + err = 0; + goto reply; + } + pg_pool_t *pp = 0; + if (pending_inc.new_pools.count(pool)) + pp = &pending_inc.new_pools[pool]; + if (!pp) { + pp = &pending_inc.new_pools[pool]; + *pp = *p; + } + if (pp->snap_exists(snapname.c_str())) { + ss << "pool " << poolstr << " snap " << snapname << " already exists"; } else { - const pg_pool_t *p = osdmap.get_pg_pool(pool); - pg_pool_t *pp = 0; - if (pending_inc.new_pools.count(pool)) - pp = &pending_inc.new_pools[pool]; - string snapname; - cmd_getval(g_ceph_context, cmdmap, "snap", snapname); - if (p->snap_exists(snapname.c_str()) || - (pp && pp->snap_exists(snapname.c_str()))) { - ss << "pool " << poolstr << " snap " << snapname << " already exists"; - err = 0; - } else { - if (!pp) { - pp = &pending_inc.new_pools[pool]; - *pp = *p; - } - pp->add_snap(snapname.c_str(), ceph_clock_now(g_ceph_context)); - pp->set_snap_epoch(pending_inc.epoch); - ss << "created pool " << poolstr << " snap " << snapname; - getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); - return true; - } + pp->add_snap(snapname.c_str(), ceph_clock_now(g_ceph_context)); + pp->set_snap_epoch(pending_inc.epoch); + ss << "created pool " << poolstr << " snap " << snapname; } + getline(ss, rs); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + return true; } else if (prefix == "osd pool rmsnap") { string poolstr; cmd_getval(g_ceph_context, cmdmap, "pool", poolstr); -- 2.47.3