]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
class: when class not found, don't wait forever
authorYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 22 May 2009 23:57:52 +0000 (16:57 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 22 May 2009 23:57:52 +0000 (16:57 -0700)
src/common/ClassHandler.cc
src/common/ClassHandler.h
src/osd/OSD.cc

index 713f32343f87d0d1bed3664d10584a49ac195c43..0cbce6f64c776f1eb67b37364d348a8b4fb79ebe 100644 (file)
@@ -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);
     }
   }
 }
index 6a1e2edf9d539fff2a97998611213f0a2ad3047f..aed49018de7f611b456d16b16736bbaae9e98ac1 100644 (file)
@@ -33,6 +33,7 @@ public:
   struct ClassData {
     enum { 
       CLASS_UNKNOWN, 
+      CLASS_INVALID, 
       //CLASS_UNLOADED, 
       CLASS_LOADED, 
       CLASS_REQUESTED, 
index e7ee2182ac327b97381c5c76664eb2933620c6fa..3cb7495cab871699003565f712f7fb6894e7418a 100644 (file)
@@ -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;