diff options
author | Sage Weil <sage@inktank.com> | 2013-07-16 17:08:23 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-07-17 09:44:50 -0700 |
commit | d1501938f5d07c067d908501fc5cfe3c857d7281 (patch) | |
tree | 883f59996104a1d96e8465f847fe10aa572c2702 | |
parent | 56c5b83589ce420fec79019a8182003117967f17 (diff) | |
download | ceph-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.cc | 47 |
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); |