From edb2f80c25a476b4b0ad8014bbd812cc46d16239 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 5 Jun 2009 11:52:43 -0700 Subject: [PATCH] osd: add 'osd pool rmsnap poolname snapname' command --- src/mon/OSDMonitor.cc | 31 +++++++++++++++++++++++++++++++ src/osd/osd_types.h | 11 ++++++++--- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index bb511b9aaaa49..fc8a5283a4bb7 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1142,6 +1142,37 @@ bool OSDMonitor::prepare_command(MMonCommand *m) } } } + else if (m->cmd.size() >= 5 && m->cmd[2] == "rmsnap") { + int pool = osdmap.lookup_pg_pool_name(m->cmd[3].c_str()); + if (pool < 0) { + ss << "unrecognized pool '" << m->cmd[3] << "'"; + err = -ENOENT; + } 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 << " does not exists"; + err = -ENOENT; + } else { + if (!pp) { + pp = &pending_inc.new_pools[pool]; + *pp = *p; + } + snapid_t sn = pp->snap_exists(snapname.c_str()); + pp->remove_snap(sn); + pp->set_snap_epoch(pending_inc.epoch); + ss << "removed pool " << m->cmd[3] << " snap " << snapname; + getline(ss, rs); + paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs)); + return true; + } + } + + } else if (m->cmd[2] == "create" && m->cmd.size() >= 4) { int pool = 1; for (map::iterator i = osdmap.pool_name.begin(); diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 13f2c3315cf45..e4cafd2809280 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -484,13 +484,13 @@ struct pg_pool_t { rs = removed_snaps; } } - bool snap_exists(const char *s) const { + snapid_t snap_exists(const char *s) const { for (map::const_iterator p = snaps.begin(); p != snaps.end(); p++) if (p->second.name == s) - return true; - return false; + return p->second.snapid; + return 0; } void add_snap(const char *n, utime_t stamp) { snapid_t s = get_snap_seq() + 1; @@ -499,6 +499,11 @@ struct pg_pool_t { snaps[s].name = n; snaps[s].stamp = stamp; } + void remove_snap(snapid_t s) { + assert(snaps.count(s)); + snaps.erase(s); + v.snap_seq = v.snap_seq + 1; + } SnapContext get_snap_context() const { vector s(snaps.size()); -- 2.39.5