]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
class: handle class_set messages
authorYehuda Sadeh <yehuda@hq.newdream.net>
Wed, 13 May 2009 23:39:17 +0000 (16:39 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Wed, 13 May 2009 23:39:17 +0000 (16:39 -0700)
src/include/librados.h
src/librados.cc
src/mon/ClassMonitor.cc
src/mon/ClassMonitor.h
src/mon/Monitor.cc
src/osd/ClassHandler.cc
src/testrados.c

index 538156a17301c3cd614f9c5002e5a993049d3420..876633e4ddc4d7f6586dd432c49258441ab4ced3 100644 (file)
@@ -20,6 +20,8 @@ void rados_deinitialize();
 /* read/write objects */
 int rados_write(struct ceph_object *oid, const char *buf, off_t off, size_t len);
 int rados_read(struct ceph_object *oid, char *buf, off_t off, size_t len);
+int rados_exec(struct ceph_object *o, const char *code,
+                          off_t data_off, size_t data_len, char *buf, size_t out_len);
 
 #ifdef __cplusplus
 }
index b0472a36fb62003ed153ce9b4674991281e3f167..81b8746624410e2c708c05068b6c342421a5a5f6 100644 (file)
@@ -415,3 +415,10 @@ extern "C" int rados_read(ceph_object *o, char *buf, off_t off, size_t len)
   return radosp->read(oid, buf, off, len);
 }
 
+extern "C" int rados_exec(ceph_object *o, const char *code,
+                          off_t data_off, size_t data_len, char *buf, size_t out_len)
+{
+  object_t oid(*o);
+  return radosp->exec(oid, code, data_off, data_len, buf, out_len);
+}
+
index d9955b60e6fc25b4a4398f8afceeedc154453d69..177078c9cc12fd50907862db7c7d459d498cdfaf 100644 (file)
@@ -81,6 +81,22 @@ void ClassMonitor::create_initial(bufferlist& bl)
   pending_class.insert(pair<utime_t,ClassLibraryIncremental>(i.stamp, inc));
 }
 
+bool ClassMonitor::store_impl(ClassLibrary& info, ClassImpl& impl)
+{
+  char *store_name;
+  int len = info.name.length() + 16;
+  store_name = (char *)malloc(len);
+  snprintf(store_name, len, "%s.%d", info.name.c_str(), (int)info.version);
+  dout(0) << "storing inc.impl length=" << impl.binary.length() << dendl;
+  mon->store->put_bl_ss(impl.binary, "class_impl", store_name);
+  bufferlist bl;
+  ::encode(info, bl);
+  mon->store->append_bl_ss(bl, "class_impl", store_name);
+  dout(0) << "adding name=" << info.name << " version=" << info.version <<  " store_name=" << store_name << dendl;
+  free(store_name);
+}
+
+
 bool ClassMonitor::update_from_paxos()
 {
   version_t paxosv = paxos->get_version();
@@ -117,15 +133,7 @@ bool ClassMonitor::update_from_paxos()
     inc.decode_impl(impl);
     inc.decode_info(info);
     if (inc.add) {
-      char *store_name;
-      int len = info.name.length() + 16;
-      store_name = (char *)malloc(len);
-      snprintf(store_name, len, "%s.%d", info.name.c_str(), (int)info.version);
-      dout(0) << "storing inc.impl length=" << inc.impl.length() << dendl;
-      mon->store->put_bl_ss(impl.binary, "class_impl", store_name);
-      mon->store->append_bl_ss(inc.info, "class_impl", store_name);
-      dout(0) << "adding name=" << info.name << " version=" << info.version <<  " store_name=" << store_name << dendl;
-      free(store_name);
+      store_impl(info, impl);
       list.add(info.name, info.version);
     } else {
       list.remove(info.name, info.version);
@@ -287,6 +295,8 @@ void ClassMonitor::handle_request(MClass *m)
 
   if (!reply)
     return;
+
+  deque<ClassImpl>::iterator impl_iter = m->impl.begin();
   
   for (deque<ClassLibrary>::iterator p = m->info.begin();
        p != m->info.end();
@@ -295,22 +305,34 @@ void ClassMonitor::handle_request(MClass *m)
     version_t ver;
 
     reply->info.push_back(*p);
-
-    if (list.get_ver((*p).name, &ver)) {
-      char *store_name;
-      int len = (*p).name.length() + 16;
-      int bin_len;
-      store_name = (char *)malloc(len);
-      snprintf(store_name, len, "%s.%d", (*p).name.c_str(), ver);
-      bin_len = mon->store->get_bl_ss(impl.binary, "class_impl", store_name);
-      assert(bin_len > 0);
-      dout(0) << "replying with name=" << (*p).name << " version=" << ver <<  " store_name=" << store_name << dendl;
-      free(store_name);
-      list.add((*p).name, ver);
-      reply->add.push_back(true);
-      reply->impl.push_back(impl);
-    } else {
-      reply->add.push_back(false);
+    switch (m->action) {
+    case CLASS_GET:
+      if (list.get_ver((*p).name, &ver)) {
+        char *store_name;
+        int len = (*p).name.length() + 16;
+        int bin_len;
+        store_name = (char *)malloc(len);
+        snprintf(store_name, len, "%s.%d", (*p).name.c_str(), ver);
+        bin_len = mon->store->get_bl_ss(impl.binary, "class_impl", store_name);
+        assert(bin_len > 0);
+        dout(0) << "replying with name=" << (*p).name << " version=" << ver <<  " store_name=" << store_name << dendl;
+        free(store_name);
+        list.add((*p).name, ver);
+        reply->add.push_back(true);
+        reply->impl.push_back(impl);
+      } else {
+        reply->add.push_back(false);
+      }
+      break;
+    case CLASS_SET:
+       {
+         /* FIXME should handle entries removal */
+         ClassLibrary& entry = list.library_map[(*p).name];
+         entry.name = (*p).name;
+         entry.version = (*p).version;
+         store_impl(entry, *impl_iter);
+         impl_iter++;
+       } 
     }
   }
   reply->action = CLASS_RESPONSE;
index 517a7c544c58acdb1fa2e8ba13dd9ed60f1df897..e297aacb718fd7de5d8824c3ca3acd150f18192d 100644 (file)
@@ -59,7 +59,7 @@ private:
 
   bool preprocess_command(MMonCommand *m);
   bool prepare_command(MMonCommand *m);
-
+  bool store_impl(ClassLibrary& info, ClassImpl& impl);
  public:
   ClassMonitor(Monitor *mn, Paxos *p) : PaxosService(mn, p) { }
   void handle_request(MClass *m);
index 0a4cf198466f221d8aebc66bc98ccb737485a221..fe548e30992866c4555680a2adb50088fef46597 100644 (file)
@@ -591,13 +591,7 @@ void Monitor::handle_class(MClass *m)
   switch (m->action) {
     case CLASS_SET:
     case CLASS_GET:
-      {
-        deque<ClassLibrary>::iterator iter;
-        for (iter = m->info.begin(); iter != m->info.end(); ++iter) {
-          dout(0) << "CLASS_GET " << *iter << dendl;
-          ((ClassMonitor *)paxos_service[PAXOS_CLASS])->handle_request(m);
-        }
-      }
+      ((ClassMonitor *)paxos_service[PAXOS_CLASS])->handle_request(m);
       break;
     case CLASS_RESPONSE:
       dout(0) << "got a class response (" << *m << ") ???" << dendl;
index c6c0730d6e2d4796b94e13cd006bd0201dbbe5ca..9cae7a8c660a44fce6567374699d9e9a30796e8d 100644 (file)
@@ -72,6 +72,12 @@ bool ClassHandler::load_class(string name)
   unlink(fname);
   free(fname);
 
+  if (class_data.handle) {
+    dout(0) << "successfuly loaded class " << name << dendl;
+  } else {
+    dout(0) << "failed loading class " << name << dendl;
+  }
+
   return (class_data.handle != NULL);
 }
 
index a4833e1a827bcf39a4918bc3f21ac56c88d16ca5..8b9d7c87372c4761772e9016a956494a9b89f053 100644 (file)
@@ -36,7 +36,7 @@ int main(int argc, const char **argv)
   oid.ino = 0x2010;
 
   rados_write(&oid, buf, 0, strlen(buf) + 1);
-  //rados_exec(&oid, "code", 0, 128, buf, 128);
+  rados_exec(&oid, "code", 0, 128, buf, 128);
   printf("exec result=%s\n", buf);
   int size = rados_read(&oid, buf2, 0, 128);