ss << "failed to open file '" << file_name << "'";
r = -EINVAL;
goto out;
- }
+ }
- std::set <pg_t> keys;
- for (hash_map<pg_t, PG*>::const_iterator pg_map_e = pg_map.begin();
- pg_map_e != pg_map.end(); ++pg_map_e) {
- keys.insert(pg_map_e->first);
+ std::set <pg_t> keys;
+ for (hash_map<pg_t, PG*>::const_iterator pg_map_e = pg_map.begin();
+ pg_map_e != pg_map.end(); ++pg_map_e) {
+ keys.insert(pg_map_e->first);
+ }
+
+ fout << "*** osd " << whoami << ": dump_missing ***" << std::endl;
+ for (std::set <pg_t>::iterator p = keys.begin();
+ p != keys.end(); ++p) {
+ hash_map<pg_t, PG*>::iterator q = pg_map.find(*p);
+ assert(q != pg_map.end());
+ PG *pg = q->second;
+ pg->lock();
+
+ fout << *pg << std::endl;
- std::map<hobject_t, pg_missing_t::item>::iterator mend = pg->missing.missing.end();
- std::map<hobject_t, pg_missing_t::item>::iterator mi = pg->missing.missing.begin();
++ std::map<hobject_t, pg_missing_t::item>::const_iterator mend =
++ pg->pg_log.get_missing().missing.end();
++ std::map<hobject_t, pg_missing_t::item>::const_iterator mi =
++ pg->pg_log.get_missing().missing.begin();
+ for (; mi != mend; ++mi) {
+ fout << mi->first << " -> " << mi->second << std::endl;
+ map<hobject_t, set<int> >::const_iterator mli =
+ pg->missing_loc.find(mi->first);
+ if (mli == pg->missing_loc.end())
+ continue;
+ const set<int> &mls(mli->second);
+ if (mls.empty())
+ continue;
+ fout << "missing_loc: " << mls << std::endl;
}
-
- fout << "*** osd " << whoami << ": dump_missing ***" << std::endl;
- for (std::set <pg_t>::iterator p = keys.begin();
- p != keys.end(); ++p) {
- hash_map<pg_t, PG*>::iterator q = pg_map.find(*p);
- assert(q != pg_map.end());
- PG *pg = q->second;
- pg->lock();
-
- fout << *pg << std::endl;
- std::map<hobject_t, pg_missing_t::item>::const_iterator mend =
- pg->pg_log.get_missing().missing.end();
- std::map<hobject_t, pg_missing_t::item>::const_iterator mi =
- pg->pg_log.get_missing().missing.begin();
- for (; mi != mend; ++mi) {
- fout << mi->first << " -> " << mi->second << std::endl;
- map<hobject_t, set<int> >::const_iterator mli =
- pg->missing_loc.find(mi->first);
- if (mli == pg->missing_loc.end())
- continue;
- const set<int> &mls(mli->second);
- if (mls.empty())
- continue;
- fout << "missing_loc: " << mls << std::endl;
- }
- pg->unlock();
- fout << std::endl;
- }
-
- fout.close();
+ pg->unlock();
+ fout << std::endl;
}
- else if (cmd.size() == 3 && cmd[1] == "kick_recovery_wq") {
- r = g_conf->set_val("osd_recovery_delay_start", cmd[2].c_str());
- if (r != 0) {
- ss << "kick_recovery_wq: error setting "
- << "osd_recovery_delay_start to '" << cmd[2] << "': error "
- << r;
- goto out;
- }
- g_conf->apply_changes(NULL);
- ss << "kicking recovery queue. set osd_recovery_delay_start "
- << "to " << g_conf->osd_recovery_delay_start;
- defer_recovery_until = ceph_clock_now(g_ceph_context);
- defer_recovery_until += g_conf->osd_recovery_delay_start;
- recovery_wq.wake();
+
+ fout.close();
+ }
+ else if (prefix == "debug kick_recovery_wq") {
+ int64_t delay;
+ cmd_getval(g_ceph_context, cmdmap, "delay", delay);
+ ostringstream oss;
+ oss << delay;
+ r = g_conf->set_val("osd_recovery_delay_start", oss.str().c_str());
+ if (r != 0) {
+ ss << "kick_recovery_wq: error setting "
+ << "osd_recovery_delay_start to '" << delay << "': error "
+ << r;
+ goto out;
}
+ g_conf->apply_changes(NULL);
+ ss << "kicking recovery queue. set osd_recovery_delay_start "
+ << "to " << g_conf->osd_recovery_delay_start;
+ defer_recovery_until = ceph_clock_now(g_ceph_context);
+ defer_recovery_until += g_conf->osd_recovery_delay_start;
+ recovery_wq.wake();
}
- else if (cmd[0] == "cpu_profiler") {
- cpu_profiler_handle_command(cmd, ss);
+ else if (prefix == "cpu_profiler") {
+ string arg;
+ cmd_getval(g_ceph_context, cmdmap, "arg", arg);
+ vector<string> argvec;
+ get_str_vec(arg, argvec);
+ cpu_profiler_handle_command(argvec, ds);
}
- else if (cmd[0] == "dump_pg_recovery_stats") {
+ else if (prefix == "dump_pg_recovery_stats") {
stringstream s;
pg_recovery_stats.dump(s);
- ss << "dump pg recovery stats: " << s.str();
+ ds << "dump pg recovery stats: " << s.str();
}
- else if (cmd[0] == "reset_pg_recovery_stats") {
+ else if (prefix == "reset_pg_recovery_stats") {
ss << "reset pg recovery stats";
pg_recovery_stats.reset();
}
int ReplicatedPG::do_command(vector<string>& cmd, ostream& ss,
bufferlist& idata, bufferlist& odata)
{
-
+ const pg_missing_t &missing = pg_log.get_missing();
+ map<string, cmd_vartype> cmdmap;
+ string prefix;
- if (cmd.size() && cmd[0] == "query") {
+ if (cmd.empty()) {
+ ss << "no command given";
+ return -EINVAL;
+ }
+
+ stringstream ss2;
+ if (!cmdmap_from_json(cmd, &cmdmap, ss2)) {
+ ss << ss2.str();
+ return -EINVAL;
+ }
+
+ cmd_getval(g_ceph_context, cmdmap, "prefix", prefix);
+ if (prefix != "pg") {
+ ss << "ReplicatedPG::do_command: not pg command";
+ return -EINVAL;
+ }
+
+ string command;
+ cmd_getval(g_ceph_context, cmdmap, "cmd", command);
+ if (command == "query") {
JSONFormatter jsf(true);
jsf.open_object_section("pg");
jsf.dump_string("state", pg_state_string(get_state()));