From 48d43e1a4a76594039bfd3e9cf3f63db70b0b8a5 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 5 Jun 2009 11:46:17 -0700 Subject: [PATCH] mon: create pool snaps --- src/mon/OSDMonitor.cc | 51 ++++++++++++++++++++++++++++++------------- src/osd/OSDMap.cc | 4 ++++ src/osd/osd_types.h | 15 +++++++++++++ 3 files changed, 55 insertions(+), 15 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 0fea3c5bde945..bb511b9aaaa49 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1113,7 +1113,36 @@ bool OSDMonitor::prepare_command(MMonCommand *m) } } else if (m->cmd[1] == "pool" && m->cmd.size() >= 3) { - if (m->cmd[2] == "create" && m->cmd.size() >= 4) { + if (m->cmd.size() >= 5 && m->cmd[2] == "mksnap") { + 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 << " already exists"; + err = -EEXIST; + } else { + if (!pp) { + pp = &pending_inc.new_pools[pool]; + *pp = *p; + } + pp->add_snap(snapname.c_str(), g_clock.now()); + pp->set_snap_epoch(pending_inc.epoch); + ss << "created 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(); i != osdmap.pool_name.end(); @@ -1140,17 +1169,12 @@ bool OSDMonitor::prepare_command(MMonCommand *m) paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs)); return true; } else if (m->cmd[2] == "set") { - int pool = -1; - pg_pool_t *p = 0; - for (map::iterator i = osdmap.pool_name.begin(); - i != osdmap.pool_name.end(); - i++) { - if (i->second == m->cmd[3]) { - pool = i->first; - p = &osdmap.pools[pool]; - } - } - if (pool >= 0) { + 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); int n = atoi(m->cmd[5].c_str()); if (n) { if (m->cmd[4] == "size") { @@ -1194,9 +1218,6 @@ bool OSDMonitor::prepare_command(MMonCommand *m) ss << "unrecognized pool field " << m->cmd[4]; } } - } else { - ss << "unrecognized pool '" << m->cmd[3] << "'"; - err = -ENOENT; } } } diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 9e74f218988aa..ad1b6a421afd9 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -29,6 +29,10 @@ void OSDMap::print(ostream& out) out << "pg_pool " << p->first << " '" << pool_name[p->first] << "' " << p->second << "\n"; + for (map::iterator q = p->second.snaps.begin(); + q != p->second.snaps.end(); + q++) + out << "\tsnap " << q->second.snapid << " '" << q->second.name << "' " << q->second.stamp << "\n"; if (!p->second.removed_snaps.empty()) out << "\tremoved_snaps " << p->second.removed_snaps << "\n"; } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index d684b300e7a5b..13f2c3315cf45 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -484,6 +484,21 @@ struct pg_pool_t { rs = removed_snaps; } } + bool 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; + } + void add_snap(const char *n, utime_t stamp) { + snapid_t s = get_snap_seq() + 1; + v.snap_seq = s; + snaps[s].snapid = s; + snaps[s].name = n; + snaps[s].stamp = stamp; + } SnapContext get_snap_context() const { vector s(snaps.size()); -- 2.39.5