From: Sage Weil Date: Thu, 26 Aug 2010 20:22:49 +0000 (-0700) Subject: osd: clean up class loading code a bit X-Git-Tag: v0.22~210 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=79f86c9b95a6f7ec86ea922aa16f802985085fb6;p=ceph.git osd: clean up class loading code a bit --- diff --git a/src/common/ClassHandler.cc b/src/common/ClassHandler.cc index f694f89ccb23..8fe58485a1ca 100644 --- a/src/common/ClassHandler.cc +++ b/src/common/ClassHandler.cc @@ -98,36 +98,36 @@ ClassHandler::ClassData& ClassHandler::get_obj(const string& cname) ClassHandler::ClassData *ClassHandler::get_class(const string& cname, ClassVersion& version) { - ClassHandler::ClassData *ret = NULL; - ClassData *class_data = &get_obj(cname); - if (class_data == &null_cls_data) + ClassData *ret = NULL; + ClassData *cls = &get_obj(cname); + if (cls == &null_cls_data) return NULL; - Mutex::Locker lock(*class_data->mutex); + Mutex::Locker lock(*cls->mutex); - switch (class_data->status) { + switch (cls->status) { + case ClassData::CLASS_LOADED: case ClassData::CLASS_ERROR: case ClassData::CLASS_INVALID: - case ClassData::CLASS_LOADED: - if (class_data->cache_timed_out()) { + if (cls->cache_timed_out()) { dout(0) << "class timed out going to send request for " << cname.c_str() << " v" << version << dendl; - ret = class_data; + ret = cls; goto send; } - return class_data; + return cls; + case ClassData::CLASS_REQUESTED: return NULL; - break; case ClassData::CLASS_UNKNOWN: - class_data->set_status(ClassData::CLASS_REQUESTED); + cls->set_status(ClassData::CLASS_REQUESTED); break; default: assert(0); } - class_data->version = version; + cls->version = version; send: osd->send_class_request(cname.c_str(), version); return ret; @@ -144,26 +144,26 @@ void ClassHandler::handle_class(MClass *m) ++info_iter, ++add_iter) { ClassData& data = get_obj(info_iter->name); if (&data == &null_cls_data) { - dout(0) << "couldn't get class, out of memory? continuing" << dendl; + dout(1) << "couldn't get class, out of memory? continuing" << dendl; continue; } - dout(0) << "handle_class " << info_iter->name << dendl; + dout(10) << "handle_class " << info_iter->name << dendl; data.mutex->Lock(); if (*add_iter) { - data.set_status(ClassData::CLASS_REQUESTED); - dout(10) << "added class '" << info_iter->name << "'" << dendl; - data.impl = *impl_iter; - ++impl_iter; - int ret = _load_class(data); - if (ret < 0) { - data.set_status(ClassData::CLASS_ERROR); - osd->got_class(info_iter->name); - } + data.set_status(ClassData::CLASS_REQUESTED); + dout(10) << "added class '" << info_iter->name << "'" << dendl; + data.impl = *impl_iter; + ++impl_iter; + int ret = _load_class(data); + if (ret < 0) { + data.set_status(ClassData::CLASS_ERROR); + osd->got_class(info_iter->name); + } } else { - dout(10) << "response of an invalid class '" << info_iter->name << "'" << dendl; - data.set_status(ClassData::CLASS_INVALID); - osd->got_class(info_iter->name); + dout(10) << "response of an invalid class '" << info_iter->name << "'" << dendl; + data.set_status(ClassData::CLASS_INVALID); + osd->got_class(info_iter->name); } data.mutex->Unlock(); } diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 5a00de1918b9..43319a098f93 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -4809,16 +4809,17 @@ void OSD::wait_for_no_ops() // -------------------------------- -int OSD::get_class(const string& cname, ClassVersion& version, pg_t pgid, Message *m, ClassHandler::ClassData **cls) +int OSD::get_class(const string& cname, ClassVersion& version, pg_t pgid, Message *m, + ClassHandler::ClassData **pcls) { Mutex::Locker l(class_lock); - dout(10) << "wait_for_missing_class '" << cname << "' by " << pgid << dendl; + dout(10) << "get_class '" << cname << "' by " << m << dendl; - - *cls = class_handler->get_class(cname, version); - if (*cls) { - switch ((*cls)->status) { + ClassHandler::ClassData *cls = class_handler->get_class(cname, version); + if (cls) { + switch (cls->status) { case ClassHandler::ClassData::CLASS_LOADED: + *pcls = cls; return 0; case ClassHandler::ClassData::CLASS_INVALID: dout(0) << "class not supported" << dendl; @@ -4831,6 +4832,7 @@ int OSD::get_class(const string& cname, ClassVersion& version, pg_t pgid, Messag } } + dout(10) << "get_class '" << cname << "' by " << m << " waiting for missing class" << dendl; waiting_for_missing_class[cname].push_back(m); return -EAGAIN; }