// --------------------------------
-ClassHandler::ClassData *OSD::get_class(const nstring& cname, pg_t pgid, Message *m)
+int OSD::get_class(const nstring& cname, pg_t pgid, Message *m, ClassHandler::ClassData **cls)
{
- ClassHandler::ClassData *cls;
Mutex::Locker l(class_lock);
dout(10) << "wait_for_missing_class '" << cname << "' by " << pgid << dendl;
- cls = class_handler->get_class(cname);
- if (cls)
- return cls;
+ *cls = class_handler->get_class(cname);
+ if (*cls)
+ return 0;
waiting_for_missing_class[cname][pgid].push_back(m);
- return NULL;
+ return -EAGAIN;
}
void OSD::got_class(const nstring& cname)
Mutex class_lock;
map<nstring, map<pg_t, list<Message*> > > waiting_for_missing_class;
- ClassHandler::ClassData *get_class(const nstring& cname, pg_t pgid, Message *m);
+ int get_class(const nstring& cname, pg_t pgid, Message *m, ClassHandler::ClassData **cls);
void handle_class(MClass *m);
public:
void got_class(const nstring& cname);
bp.copy(p->indata_len, indata);
//dout(20) << "rdcall param=" << indata.c_str() << dendl;
- ClassHandler::ClassData *cls = osd->get_class(cname, info.pgid, op);
- if (!cls) {
+ ClassHandler::ClassData *cls;
+ result = osd->get_class(cname, info.pgid, op, &cls);
+ if (result) {
dout(10) << "rdcall class " << cname << " does not exist" << dendl;
- result = -EINVAL;
} else {
bufferlist outdata;
ClassHandler::ClassMethod *method = cls->get_method(mname.c_str());
OpContext ctx(soid, oi, op->ops);
// do it.
- do_read_ops(op, ctx, bp, data, &data_off);
+ result = do_read_ops(op, ctx, bp, data, &data_off);
}
done:
stat_object_temp_rd[soid].hit(now); // hit temp.
}
- osd->messenger->send_message(reply, op->get_orig_source_inst());
- delete op;
+ if (result != -EAGAIN) {
+ osd->messenger->send_message(reply, op->get_orig_source_inst());
+ delete op;
+ }
}