From 64bef4ae4bab28b0b82a1481381b0c68a22fe1a4 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sat, 17 Aug 2013 09:05:32 -0700 Subject: [PATCH] mon/OSDMonitor: make 'osd pool mksnap ...' not expose uncommitted state [This is a backport of d1501938f5d07c067d908501fc5cfe3c857d7281] 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 | 50 +++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 3bec49ba614d7..d7968362c2786 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -3297,33 +3297,37 @@ bool OSDMonitor::prepare_command(MMonCommand *m) } else if (m->cmd[1] == "pool" && m->cmd.size() >= 3) { if (m->cmd.size() >= 5 && m->cmd[2] == "mksnap") { - int64_t pool = osdmap.lookup_pg_pool_name(m->cmd[3].c_str()); + string poolstr = m->cmd[3]; + int64_t pool = osdmap.lookup_pg_pool_name(poolstr.c_str()); if (pool < 0) { - ss << "unrecognized pool '" << m->cmd[3] << "'"; + ss << "unrecognized pool '" << poolstr << "'"; err = -ENOENT; + goto out; + } + const string& snapname = m->cmd[4]; + 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 out; + } + 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]; - const string& snapname = m->cmd[4]; - if (p->snap_exists(snapname.c_str()) || - (pp && pp->snap_exists(snapname.c_str()))) { - ss << "pool " << m->cmd[3] << " 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 " << m->cmd[3] << " snap " << snapname; - getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_version())); - 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 (m->cmd.size() >= 5 && m->cmd[2] == "rmsnap") { const string& poolstr = m->cmd[3].c_str(); -- 2.39.5