}
-ClassHandler::ClassData *ClassHandler::get_class(const nstring& cname)
+ClassHandler::ClassData *ClassHandler::get_class(const nstring& cname, ClassVersion& version)
{
ClassData *class_data = &classes[cname];
assert(0);
}
- osd->send_class_request(cname.c_str());
+ osd->send_class_request(cname.c_str(), version);
return NULL;
}
void ClassHandler::resend_class_requests()
{
for (map<nstring,ClassData>::iterator p = classes.begin(); p != classes.end(); p++)
- osd->send_class_request(p->first.c_str());
+ osd->send_class_request(p->first.c_str(), p->second.version);
}
ClassHandler::ClassData *ClassHandler::register_class(const char *cname)
CLASS_REQUESTED,
//CLASS_ERROR
} status;
- version_t version;
+ ClassVersion version;
ClassImpl impl;
void *handle;
bool registered;
map<string, ClassMethod> methods_map;
- ClassData() : status(CLASS_UNKNOWN), version(-1), handle(NULL), registered(false) {}
+ ClassData() : status(CLASS_UNKNOWN), version(), handle(NULL), registered(false) {}
~ClassData() { }
ClassMethod *register_method(const char *mname,
ClassHandler(OSD *_osd) : osd(_osd) {}
- ClassData *get_class(const nstring& cname);
+ ClassData *get_class(const nstring& cname, ClassVersion& version);
void resend_class_requests();
void handle_class(MClass *m);
}
const char *str() { return ver.c_str(); };
+ bool is_default() { return (ver.length() == 0); }
};
WRITE_CLASS_ENCODER(ClassVersion)
// --------------------------------
-int OSD::get_class(const nstring& cname, pg_t pgid, Message *m, ClassHandler::ClassData **cls)
+int OSD::get_class(const nstring& cname, ClassVersion& version, pg_t pgid, Message *m, ClassHandler::ClassData **cls)
{
Mutex::Locker l(class_lock);
dout(10) << "wait_for_missing_class '" << cname << "' by " << pgid << dendl;
- *cls = class_handler->get_class(cname);
+
+ *cls = class_handler->get_class(cname, version);
if (*cls)
return 0;
delete m;
}
-void OSD::send_class_request(const char *cname)
+void OSD::send_class_request(const char *cname, ClassVersion& version)
{
- dout(10) << "send_class_request '" << cname << "'" << dendl;
+ dout(10) << "send_class_request class=" << cname << " version=" << version << dendl;
MClass *m = new MClass(monmap->get_fsid(), 0);
ClassInfo info;
info.name = cname;
+ info.version = version;
m->info.push_back(info);
m->action = CLASS_GET;
int mon = monmap->pick_mon();
Mutex class_lock;
map<nstring, map<pg_t, list<Message*> > > waiting_for_missing_class;
- int get_class(const nstring& cname, pg_t pgid, Message *m, ClassHandler::ClassData **cls);
+ int get_class(const nstring& cname, ClassVersion& version, pg_t pgid, Message *m, ClassHandler::ClassData **cls);
void handle_class(MClass *m);
public:
void got_class(const nstring& cname);
- void send_class_request(const char *n);
+ void send_class_request(const char *n, ClassVersion& version);
protected:
// -- placement groups --
//dout(20) << "rdcall param=" << indata.c_str() << dendl;
ClassHandler::ClassData *cls;
- result = osd->get_class(cname, info.pgid, ctx->op, &cls);
+ ClassVersion version;
+ result = osd->get_class(cname, version, info.pgid, ctx->op, &cls);
if (result) {
dout(10) << "rdcall class " << cname << " does not exist" << dendl;
if (result == -EAGAIN)