From 8f740758367a62ed33813b2e0db1144abb46ba44 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 26 Nov 2008 13:50:33 -0800 Subject: [PATCH] mon: instruct individual pgs to scrub Factor out pg parsing into pg_t. --- src/mon/PGMonitor.cc | 24 ++++++++++++++++++++++++ src/osd/osd_types.h | 18 +++++++++++++++++- src/osdmaptool.cc | 8 ++------ 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/mon/PGMonitor.cc b/src/mon/PGMonitor.cc index d8bbd9e7bf1c2..e30d10ec5a8d8 100644 --- a/src/mon/PGMonitor.cc +++ b/src/mon/PGMonitor.cc @@ -26,6 +26,7 @@ #include "messages/MStatfsReply.h" #include "messages/MOSDPGCreate.h" #include "messages/MMonCommand.h" +#include "messages/MOSDScrub.h" #include "common/Timer.h" @@ -630,6 +631,29 @@ bool PGMonitor::preprocess_command(MMonCommand *m) ss << "ok"; r = 0; } + else if (m->cmd[1] == "scrub" && m->cmd.size() == 3) { + pg_t pgid; + r = -EINVAL; + if (pgid.parse(m->cmd[2].c_str())) { + if (mon->pgmon->pg_map.pg_stat.count(pgid)) { + if (mon->pgmon->pg_map.pg_stat[pgid].acting.size()) { + int osd = mon->pgmon->pg_map.pg_stat[pgid].acting[0]; + if (mon->osdmon->osdmap.is_up(osd)) { + vector pgs(1); + pgs[0] = pgid; + mon->messenger->send_message(new MOSDScrub(mon->monmap->fsid, pgs), + mon->osdmon->osdmap.get_inst(osd)); + ss << "instructing pg " << pgid << " on osd" << osd << " to scrub"; + r = 0; + } else + ss << "pg " << pgid << " primary osd" << osd << " not up"; + } else + ss << "pg " << pgid << " has no primary osd"; + } else + ss << "pg " << pgid << " dne"; + } else + ss << "invalid pgid '" << m->cmd[2] << "'"; + } } if (r != -1) { diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 0196cea201157..abed428f73743 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -15,6 +15,8 @@ #ifndef __OSD_TYPES_H #define __OSD_TYPES_H +#include + #include "msg/msg_types.h" #include "include/types.h" #include "include/pobject.h" @@ -133,6 +135,20 @@ public: return coll_t(u.pg64, sn); } + bool parse(const char *s) { + int numrep; + int pool; + int ps; + int r = sscanf(s, "%dx%d.%x", &numrep, &pool, &ps); + if (r < 3) + return false; + u.pg.type = TYPE_REP; + u.pg.pool = pool; + u.pg.size = numrep; + u.pg.ps = ps; + u.pg.preferred = -1; + return true; + } } __attribute__ ((packed)); @@ -345,7 +361,7 @@ struct pg_stat_t { __u64 num_object_clones; vector acting; - + void encode(bufferlist &bl) const { ::encode(version, bl); ::encode(reported, bl); diff --git a/src/osdmaptool.cc b/src/osdmaptool.cc index f468b7ea1c9ff..7ff41668cf8d7 100644 --- a/src/osdmaptool.cc +++ b/src/osdmaptool.cc @@ -196,16 +196,12 @@ int main(int argc, const char **argv) } if (test_map_pg) { - int numrep; - int pool; - int ps; - int r = sscanf(test_map_pg, "%dx%d.%x", &numrep, &pool, &ps); - if (r < 3) { + pg_t pgid; + if (pgid.parse(test_map_pg)) { cerr << me << ": failed to parse pg '" << test_map_pg << "', r = " << r << std::endl; usage(me); } - pg_t pgid(pg_t::TYPE_REP, numrep, ps, pool, -1); cout << " parsed '" << test_map_pg << "' -> " << pgid << std::endl; vector acting; -- 2.39.5