From 4c64663467ccaf0ad8508d1db6614e24c036a216 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Fri, 22 May 2009 16:57:52 -0700 Subject: [PATCH] class: when class not found, don't wait forever --- src/common/ClassHandler.cc | 6 +++++- src/common/ClassHandler.h | 1 + src/osd/OSD.cc | 13 +++++++++++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/common/ClassHandler.cc b/src/common/ClassHandler.cc index 713f32343f87d..0cbce6f64c776 100644 --- a/src/common/ClassHandler.cc +++ b/src/common/ClassHandler.cc @@ -56,6 +56,9 @@ ClassHandler::ClassData *ClassHandler::get_class(const nstring& cname, ClassVers class_data->status = ClassData::CLASS_REQUESTED; break; + case ClassData::CLASS_INVALID: + return class_data; + default: assert(0); } @@ -89,7 +92,8 @@ void ClassHandler::handle_class(MClass *m) osd->got_class(info_iter->name); } } else { - /* fixme: handle case in which we didn't get the class */ + data.status = ClassData::CLASS_INVALID; + osd->got_class(info_iter->name); } } } diff --git a/src/common/ClassHandler.h b/src/common/ClassHandler.h index 6a1e2edf9d539..aed49018de7f6 100644 --- a/src/common/ClassHandler.h +++ b/src/common/ClassHandler.h @@ -33,6 +33,7 @@ public: struct ClassData { enum { CLASS_UNKNOWN, + CLASS_INVALID, //CLASS_UNLOADED, CLASS_LOADED, CLASS_REQUESTED, diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index e7ee2182ac327..3cb7495cab871 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -3761,8 +3761,17 @@ int OSD::get_class(const nstring& cname, ClassVersion& version, pg_t pgid, Messa *cls = class_handler->get_class(cname, version); - if (*cls) - return 0; + if (*cls) { + switch ((*cls)->status) { + case ClassHandler::ClassData::CLASS_LOADED: + return 0; + case ClassHandler::ClassData::CLASS_INVALID: + dout(0) << "class not supported" << dendl; + return -EOPNOTSUPP; + default: + assert(0); + } + } waiting_for_missing_class[cname][pgid].push_back(m); return -EAGAIN; -- 2.39.5