]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
class: able to add classes when doing mkfs
authorYehuda Sadeh <yehuda@hq.newdream.net>
Wed, 2 Jun 2010 19:17:22 +0000 (12:17 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Thu, 10 Jun 2010 21:45:40 +0000 (14:45 -0700)
src/cmon.cc
src/mon/ClassMonitor.cc
src/mon/Monitor.cc
src/mon/Monitor.h

index c096cfde809249ffca8cbde0cbbe8a380c56c71e..7bc758ca55fd9732fd964d2eb61b9e6276d008ec 100644 (file)
@@ -55,6 +55,8 @@ int main(int argc, const char **argv)
 
   bool mkfs = false;
   const char *osdmapfn = 0;
+  const char *classfn = 0;
+  const char *classinfo = 0;
 
   vector<const char*> args;
   argv_to_vec(argc, argv, args);
@@ -66,6 +68,10 @@ int main(int argc, const char **argv)
       mkfs = true;
     } else if (CONF_ARG_EQ("osdmap", '\0')) {
       CONF_SAFE_SET_ARG_VAL(&osdmapfn, OPT_STR);
+    } else if (CONF_ARG_EQ("class-info", '\0')) {
+      CONF_SAFE_SET_ARG_VAL(&classinfo, OPT_STR);
+    } else if (CONF_ARG_EQ("class-file", '\0')) {
+      CONF_SAFE_SET_ARG_VAL(&classfn, OPT_STR);
     } else
       usage();
   }
@@ -98,7 +104,7 @@ int main(int argc, const char **argv)
        */
 
     // load monmap
-    bufferlist monmapbl, osdmapbl;
+    bufferlist monmapbl, osdmapbl, classbl;
     int err = monmapbl.read_file(g_conf.monmap);
     if (err < 0)
       exit(1);
@@ -109,10 +115,29 @@ int main(int argc, const char **argv)
     if (err < 0)
       exit(1);
 
+    // class?
+    if ((classfn != NULL) ^ (classinfo != NULL)) {
+      cerr << "bad class arguments" << std::endl;
+      exit(1);
+    }
+
+    if (classfn && classinfo) {
+      bufferlist classbin;
+      string str;
+      int err = classbin.read_file(classfn);
+      if (err < 0) {
+        cerr << "error reading " << classfn << std::endl;
+        exit(1);
+      }
+      str = classinfo;
+      ::encode(str, classbl);
+      ::encode(classbin, classbl);
+    }
+
     // go
     MonitorStore store(g_conf.mon_data);
     Monitor mon(whoami, &store, 0, &monmap);
-    mon.mkfs(osdmapbl);
+    mon.mkfs(osdmapbl, classbl);
     cout << argv[0] << ": created monfs at " << g_conf.mon_data 
         << " for mon" << whoami
         << std::endl;
index eab18814140e94f410c3ab8db339fab66d1d853c..c433a21a823c7527aeea78fd2e715b984ef34659 100644 (file)
@@ -73,6 +73,45 @@ void ClassMonitor::create_initial(bufferlist& bl)
   ::encode(l, inc.info);
   inc.op = CLASS_INC_NOP;
   pending_class.insert(pair<utime_t,ClassLibraryIncremental>(i.stamp, inc));
+
+  bufferlist::iterator iter = bl.begin();
+  while (!iter.end()) {
+    ClassImpl impl;
+    ClassInfo info;
+    ClassLibraryIncremental incr;
+
+    string str;
+    ::decode(str, iter);
+    ::decode(impl.binary, iter);
+
+    char ver[str.length() + 1];
+    char *name;
+    char *ver_min;
+    char *ver_maj;
+    char *arch;
+
+    char classinfo[str.length() + 1];
+    strcpy(classinfo, str.c_str());
+
+    name = strtok(classinfo, ".");
+    ver_maj = strtok(NULL, ".");
+    ver_min = strtok(NULL, ".");
+    sprintf(ver, "%s.%s", ver_maj, ver_min);
+    arch = strtok(NULL, ".");
+
+    ClassVersion cv(ver, arch);
+
+    info.name = name;
+    info.version = cv;
+
+    impl.stamp = g_clock.now();
+
+    ::encode(impl, incr.impl);
+    ::encode(info, incr.info);
+    incr.op = CLASS_INC_ADD;
+
+    pending_class.insert(pair<utime_t,ClassLibraryIncremental>(impl.stamp, incr));
+  }
 }
 
 bool ClassMonitor::store_impl(ClassInfo& info, ClassImpl& impl)
@@ -118,38 +157,42 @@ bool ClassMonitor::update_from_paxos()
     assert(success);
 
     bufferlist::iterator p = bl.begin();
+
     __u8 v;
     ::decode(v, p);
-    ClassLibraryIncremental inc;
-    ::decode(inc, p);
-    ClassImpl impl;
-    ClassInfo info;
-    inc.decode_info(info);
-    switch (inc.op) {
-    case CLASS_INC_ADD:
-      inc.decode_impl(impl);
-      if (impl.binary.length() > 0) {
-        store_impl(info, impl);
-        list.add(info.name, info.version);
-      }
-      break;
-    case CLASS_INC_DEL:
-      list.remove(info.name, info.version);
-      break;
-    case CLASS_INC_ACTIVATE:
-      {
-        map<string, ClassVersionMap>::iterator mapiter = list.library_map.find(info.name);
-        if (mapiter == list.library_map.end()) {
-        } else {
-          ClassVersionMap& map = mapiter->second;
-          map.set_default(info.version.str());
+
+    while (!p.end()) {
+      ClassLibraryIncremental inc;
+      ::decode(inc, p);
+      ClassImpl impl;
+      ClassInfo info;
+      inc.decode_info(info);
+      switch (inc.op) {
+      case CLASS_INC_ADD:
+        inc.decode_impl(impl);
+        if (impl.binary.length() > 0) {
+          store_impl(info, impl);
+          list.add(info.name, info.version);
         }
+        break;
+      case CLASS_INC_DEL:
+        list.remove(info.name, info.version);
+        break;
+      case CLASS_INC_ACTIVATE:
+        {
+          map<string, ClassVersionMap>::iterator mapiter = list.library_map.find(info.name);
+          if (mapiter == list.library_map.end()) {
+          } else {
+            ClassVersionMap& map = mapiter->second;
+            map.set_default(info.version.str());
+          }
+        }
+        break;
+      case CLASS_INC_NOP:
+        break;
+      default:
+        assert(0);
       }
-      break;
-    case CLASS_INC_NOP:
-      break;
-    default:
-      assert(0);
     }
 
     list.version++;
index cf0b20bbe13853a72462f16450e5554455eaeb0f..8a91226982bef1c6931d2460780e1f22627c61e1 100644 (file)
@@ -934,7 +934,7 @@ void Monitor::tick()
  * this is the closest thing to a traditional 'mkfs' for ceph.
  * initialize the monitor state machines to their initial values.
  */
-int Monitor::mkfs(bufferlist& osdmapbl)
+int Monitor::mkfs(bufferlist& osdmapbl, bufferlist& classbl)
 {
   // create it
   int err = store->mkfs();
@@ -969,6 +969,8 @@ int Monitor::mkfs(bufferlist& osdmapbl)
       svc->create_initial(osdmapbl);
     else if (svc->paxos->machine_id == PAXOS_MONMAP)
       svc->create_initial(monmapbl);
+    else if (svc->paxos->machine_id == PAXOS_CLASS)
+      svc->create_initial(classbl);
     else
       svc->create_initial(bl);
     // commit to paxos
index 829c506e346f83473c910145914bce8f5e74a210..0401a98c2aad307f8f8f0a5f6cf09bb45a75ce63 100644 (file)
@@ -230,7 +230,7 @@ public:
 
   void stop_cluster();
 
-  int mkfs(bufferlist& osdmapbl);
+  int mkfs(bufferlist& osdmapbl, bufferlist& classbl);
 
   LogClient *get_logclient() { return &logclient; }
 };