summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-08-17 09:05:32 -0700
committerSage Weil <sage@inktank.com>2013-08-17 09:05:32 -0700
commit64bef4ae4bab28b0b82a1481381b0c68a22fe1a4 (patch)
tree3dd02a724a90e4134fc72ded4d1d0755f48b0bc7
parent411871f6bcc9a4b81140c2e98d13dc123860f6f7 (diff)
downloadceph-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.cc50
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();