]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
class: osd specifies class version when fetching class
authorYehuda Sadeh <yehuda@hq.newdream.net>
Thu, 21 May 2009 17:41:31 +0000 (10:41 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Thu, 21 May 2009 18:03:48 +0000 (11:03 -0700)
src/common/ClassHandler.cc
src/common/ClassHandler.h
src/common/ClassVersion.h
src/osd/OSD.cc
src/osd/OSD.h
src/osd/ReplicatedPG.cc

index 0b6d443cf656f1c488ec8264596de7ab05c47130..354ccd721deae082ac0d0681fdaedce9e42871da 100644 (file)
@@ -40,7 +40,7 @@ void ClassHandler::load_class(const nstring& cname)
 }
 
 
-ClassHandler::ClassData *ClassHandler::get_class(const nstring& cname)
+ClassHandler::ClassData *ClassHandler::get_class(const nstring& cname, ClassVersion& version)
 {
   ClassData *class_data = &classes[cname];
 
@@ -60,7 +60,7 @@ ClassHandler::ClassData *ClassHandler::get_class(const nstring& cname)
     assert(0);
   }
 
-  osd->send_class_request(cname.c_str());
+  osd->send_class_request(cname.c_str(), version);
   return NULL;
 }
 
@@ -96,7 +96,7 @@ void ClassHandler::handle_class(MClass *m)
 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)
index 1289ab93780aebe4b61169ca3a4282432be7e543..7f04052292462480828e67097928e9900fccdd9d 100644 (file)
@@ -37,13 +37,13 @@ public:
       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,
@@ -57,7 +57,7 @@ public:
 
   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);
index 2734693c048b298b3e7fa2f4fd8a3d1437b0b63d..43fa89418ffa51679361b7cb34854f334b1a492d 100644 (file)
@@ -28,6 +28,7 @@ public:
   }
 
   const char *str() { return ver.c_str(); };
+  bool is_default() { return (ver.length() == 0); }
 };
 WRITE_CLASS_ENCODER(ClassVersion)
 
index 1607e292bddcc55145baff7b5f2a08d8bed03190..cf33a9e0847b07d50f7f74d49db02dee39da4478 100644 (file)
@@ -3753,12 +3753,13 @@ void OSD::wait_for_no_ops()
 
 // --------------------------------
 
-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;
 
@@ -3795,12 +3796,13 @@ void OSD::handle_class(MClass *m)
   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();
index a5f809b9b4a232ee9915ffdd96dc9c0877ce3b2e..52558cdc899479cd428870c891f9969c01b863a3 100644 (file)
@@ -407,11 +407,11 @@ protected:
   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 --
index c2c564755b43ae5062df75dbf95bf1255709e001..c025b54885595df7d9d99fd3747f23e85043fa4b 100644 (file)
@@ -683,7 +683,8 @@ int ReplicatedPG::do_read_ops(ReadOpContext *ctx,
        //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)