summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-07-16 17:08:23 -0700
committerSage Weil <sage@inktank.com>2013-07-17 09:44:50 -0700
commitd1501938f5d07c067d908501fc5cfe3c857d7281 (patch)
tree883f59996104a1d96e8465f847fe10aa572c2702
parent56c5b83589ce420fec79019a8182003117967f17 (diff)
downloadceph-d1501938f5d07c067d908501fc5cfe3c857d7281.tar.gz
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 <sage@inktank.com> Reviewed-by: Joao Eduardo Luis <joao.luis@inktank.com>
-rw-r--r--src/mon/OSDMonitor.cc47
1 files 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);