diff options
author | Sage Weil <sage@inktank.com> | 2013-08-17 09:05:32 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-08-17 09:05:32 -0700 |
commit | 64bef4ae4bab28b0b82a1481381b0c68a22fe1a4 (patch) | |
tree | 3dd02a724a90e4134fc72ded4d1d0755f48b0bc7 | |
parent | 411871f6bcc9a4b81140c2e98d13dc123860f6f7 (diff) | |
download | ceph-64bef4ae4bab28b0b82a1481381b0c68a22fe1a4.tar.gz |
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 <sage@inktank.com>
Reviewed-by: Joao Eduardo Luis <joao.luis@inktank.com>
-rw-r--r-- | src/mon/OSDMonitor.cc | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 3bec49ba614..d7968362c27 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(); |