From 65371482dd661c6dc3d251fb9fd4e01812bdaa0e Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 2 Jun 2010 12:17:22 -0700 Subject: [PATCH] class: able to add classes when doing mkfs --- src/cmon.cc | 29 +++++++++++- src/mon/ClassMonitor.cc | 99 +++++++++++++++++++++++++++++------------ src/mon/Monitor.cc | 4 +- src/mon/Monitor.h | 2 +- 4 files changed, 102 insertions(+), 32 deletions(-) diff --git a/src/cmon.cc b/src/cmon.cc index c096cfde80924..7bc758ca55fd9 100644 --- a/src/cmon.cc +++ b/src/cmon.cc @@ -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 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; diff --git a/src/mon/ClassMonitor.cc b/src/mon/ClassMonitor.cc index eab18814140e9..c433a21a823c7 100644 --- a/src/mon/ClassMonitor.cc +++ b/src/mon/ClassMonitor.cc @@ -73,6 +73,45 @@ void ClassMonitor::create_initial(bufferlist& bl) ::encode(l, inc.info); inc.op = CLASS_INC_NOP; pending_class.insert(pair(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(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::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::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++; diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index cf0b20bbe1385..8a91226982bef 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -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 diff --git a/src/mon/Monitor.h b/src/mon/Monitor.h index 829c506e346f8..0401a98c2aad3 100644 --- a/src/mon/Monitor.h +++ b/src/mon/Monitor.h @@ -230,7 +230,7 @@ public: void stop_cluster(); - int mkfs(bufferlist& osdmapbl); + int mkfs(bufferlist& osdmapbl, bufferlist& classbl); LogClient *get_logclient() { return &logclient; } }; -- 2.39.5