shutdown();
}
+ else if (cmd[0] == "pg") {
+ pg_t pgid;
+
+ if (cmd.size() < 2) {
+ ss << "no pgid specified";
+ r = -EINVAL;
+ } else if (!pgid.parse(cmd[1].c_str())) {
+ ss << "couldn't parse pgid '" << cmd[1] << "'";
+ r = -EINVAL;
+ } else {
+ PG *pg = _lookup_lock_pg(pgid);
+ if (!pg) {
+ ss << "i don't have pgid " << pgid;
+ r = -ENOENT;
+ } else {
+ cmd.erase(cmd.begin(), cmd.begin() + 2);
+ r = pg->do_command(cmd, ss, odata);
+ }
+ pg->unlock();
+ }
+ }
+
else if (cmd[0] == "bench") {
uint64_t count = 1 << 30; // 1gb
uint64_t bsize = 4 << 20;
virtual void do_backfill(OpRequest *op) = 0;
virtual bool snap_trimmer() = 0;
+ virtual int do_command(vector<string>& cmd, ostream& ss, bufferlist& data) = 0;
+
virtual bool same_for_read_since(epoch_t e) = 0;
virtual bool same_for_modify_since(epoch_t e) = 0;
virtual bool same_for_rep_modify_since(epoch_t e) = 0;
// ==========================================================
+
+int ReplicatedPG::do_command(vector<string>& cmd, ostream& ss, bufferlist& data)
+{
+ ss << "unknown command " << cmd;
+ return -EINVAL;
+}
+
+// ==========================================================
+
bool ReplicatedPG::pg_op_must_wait(MOSDOp *op)
{
if (missing.missing.empty())
return transit< NotTrimming >();
}
+
ReplicatedPG(OSD *o, PGPool *_pool, pg_t p, const hobject_t& oid, const hobject_t& ioid);
~ReplicatedPG() {}
+ int do_command(vector<string>& cmd, ostream& ss, bufferlist& data);
void do_op(OpRequest *op);
bool pg_op_must_wait(MOSDOp *op);