From: Sage Weil Date: Fri, 26 Jun 2009 20:49:12 +0000 (-0700) Subject: monclient: refactor MonMap into MonClient X-Git-Tag: v0.10~117 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=653ec485ef7ef33b8df56dcf1875ec431affb970;p=ceph.git monclient: refactor MonMap into MonClient --- diff --git a/src/ceph.cc b/src/ceph.cc index 19df388c39e5..8b9415333c6d 100644 --- a/src/ceph.cc +++ b/src/ceph.cc @@ -45,8 +45,8 @@ extern "C" { Mutex lock("ceph.cc lock"); Cond cond; Messenger *messenger = 0; -MonMap monmap; SafeTimer timer(lock); +MonClient mc; const char *outfile = 0; @@ -106,8 +106,8 @@ void handle_notify(MMonObserveNotify *notify) << (notify->is_latest ? " (latest)" : "") << dendl; - if (ceph_fsid_compare(¬ify->fsid, &monmap.fsid)) { - dout(0) << notify->get_source_inst() << " notify fsid " << notify->fsid << " != " << monmap.fsid << dendl; + if (ceph_fsid_compare(¬ify->fsid, &mc.monmap.fsid)) { + dout(0) << notify->get_source_inst() << " notify fsid " << notify->fsid << " != " << mc.monmap.fsid << dendl; delete notify; return; } @@ -230,14 +230,14 @@ static void send_observe_requests(bool newmon) if (is_timeout) return; - int mon = monmap.pick_mon(newmon); + int mon = mc.monmap.pick_mon(newmon); bool sent = false; for (int i=0; isend_message(m, monmap.get_inst(mon)); + messenger->send_message(m, mc.monmap.get_inst(mon)); sent = true; } @@ -280,15 +280,15 @@ Context *event = 0; void get_status(bool newmon) { - int mon = monmap.pick_mon(newmon); + int mon = mc.monmap.pick_mon(newmon); vector vcmd(2); vcmd[0] = prefix[which]; vcmd[1] = "stat"; - MMonCommand *m = new MMonCommand(monmap.fsid, last_seen_version); + MMonCommand *m = new MMonCommand(mc.monmap.fsid, last_seen_version); m->cmd.swap(vcmd); - messenger->send_message(m, monmap.get_inst(mon)); + messenger->send_message(m, mc.monmap.get_inst(mon)); event = new C_Refresh; timer.add_event_after(.2, event); @@ -375,20 +375,20 @@ void send_command(); struct C_Resend : public Context { void finish(int) { - monmap.pick_mon(true); // pick a new mon + mc.monmap.pick_mon(true); // pick a new mon if (!reply) send_command(); } }; void send_command() { - MMonCommand *m = new MMonCommand(monmap.fsid, last_seen_version); + MMonCommand *m = new MMonCommand(mc.monmap.fsid, last_seen_version); m->cmd = pending_cmd; m->get_data() = pending_bl; - int mon = monmap.pick_mon(); + int mon = mc.monmap.pick_mon(); generic_dout(0) << "mon" << mon << " <- " << pending_cmd << dendl; - messenger->send_message(m, monmap.get_inst(mon)); + messenger->send_message(m, mc.monmap.get_inst(mon)); resend_event = new C_Resend; timer.add_event_after(15.0, resend_event); @@ -618,8 +618,7 @@ int main(int argc, const char **argv, const char *envp[]) } // get monmap - MonClient mc(&monmap, NULL); - if (!mc.get_monmap()) + if (mc.build_initial_monmap() < 0) return -1; // start up network diff --git a/src/cfuse.cc b/src/cfuse.cc index 119abddc4f4e..4a6b0102bf83 100644 --- a/src/cfuse.cc +++ b/src/cfuse.cc @@ -63,9 +63,8 @@ int main(int argc, const char **argv, const char *envp[]) { } // get monmap - MonMap monmap; - MonClient mc(&monmap, NULL); - if (!mc.get_monmap()) + MonClient mc; + if (mc.build_initial_monmap() < 0) return -1; // start up network @@ -73,7 +72,7 @@ int main(int argc, const char **argv, const char *envp[]) { rank.bind(); cout << "bound to " << rank.get_rank_addr() << ", mounting ceph" << std::endl; - Client *client = new Client(rank.register_entity(entity_name_t::CLIENT()), &monmap); + Client *client = new Client(rank.register_entity(entity_name_t::CLIENT()), &mc); rank.start(); diff --git a/src/client/Client.cc b/src/client/Client.cc index bd231da743e1..900dca1a456d 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -101,11 +101,13 @@ void client_flush_set_callback(void *p, inodeno_t ino) // cons/des -Client::Client(Messenger *m, MonMap *mm) : timer(client_lock), client_lock("Client::client_lock") +Client::Client(Messenger *m, MonClient *mc) : timer(client_lock), client_lock("Client::client_lock") { // which client am i? whoami = m->get_myname().num(); - monmap = mm; + + monclient = mc; + monclient->set_messenger(m); tick_event = 0; @@ -128,12 +130,10 @@ Client::Client(Messenger *m, MonMap *mm) : timer(client_lock), client_lock("Clie // set up messengers messenger = m; - monclient = new MonClient(monmap, messenger); - // osd interfaces osdmap = new OSDMap; // initially blank.. see mount() mdsmap = new MDSMap; - objecter = new Objecter(messenger, monmap, osdmap, client_lock); + objecter = new Objecter(messenger, &monclient->monmap, osdmap, client_lock); objecter->set_client_incarnation(0); // client always 0, for now. objectcacher = new ObjectCacher(objecter, client_lock, 0, // all ack callback @@ -158,7 +158,6 @@ Client::~Client() if (mdsmap) { delete mdsmap; mdsmap = 0; } unlink_dispatcher(monclient); - delete monclient; if (messenger) messenger->destroy(); @@ -247,8 +246,6 @@ void Client::init() messenger->set_dispatcher(this); link_dispatcher(monclient); - objecter->init(); - tick(); // do logger crap only once per process. @@ -809,9 +806,9 @@ MClientReply *Client::make_request(MClientRequest *req, if (!mdsmap->is_active(mds)) { dout(10) << "no address for mds" << mds << ", requesting new mdsmap" << dendl; - int mon = monmap->pick_mon(); - messenger->send_message(new MMDSGetMap(monmap->fsid, mdsmap->get_epoch()+1), - monmap->get_inst(mon)); + int mon = monclient->monmap.pick_mon(); + messenger->send_message(new MMDSGetMap(monclient->monmap.fsid, mdsmap->get_epoch()+1), + monclient->monmap.get_inst(mon)); waiting_for_mdsmap.push_back(&cond); cond.Wait(client_lock); @@ -2291,6 +2288,7 @@ int Client::mount() ticket = monclient->get_ticket(); objecter->signed_ticket = signed_ticket; + objecter->init(); mounted = true; diff --git a/src/client/Client.h b/src/client/Client.h index 93b269f80717..bea621056f20 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -602,7 +602,6 @@ public: MonClient *monclient; Messenger *messenger; int whoami; - MonMap *monmap; ceph_client_ticket ticket; bufferlist signed_ticket; @@ -844,7 +843,7 @@ protected: bool dispatch_impl(Message *m); public: - Client(Messenger *m, MonMap *mm); + Client(Messenger *m, MonClient *mc); ~Client(); void tear_down_cache(); diff --git a/src/cmds.cc b/src/cmds.cc index 457f30a3a7be..aaa453fafd4c 100644 --- a/src/cmds.cc +++ b/src/cmds.cc @@ -63,16 +63,14 @@ int main(int argc, const char **argv) if (g_conf.clock_tare) g_clock.tare(); // get monmap - MonMap monmap; - MonClient mc(&monmap, NULL); - if (!mc.get_monmap()) + MonClient mc; + if (mc.build_initial_monmap() < 0) return -1; SimpleMessenger rank; rank.bind(); cout << "starting mds." << g_conf.id << " at " << rank.get_rank_addr() - << " fsid " << monmap.get_fsid() << std::endl; Messenger *m = rank.register_entity(entity_name_t::MDS(-1)); @@ -88,7 +86,7 @@ int main(int argc, const char **argv) rank.start(); // start mds - MDS *mds = new MDS(g_conf.id, m, &monmap); + MDS *mds = new MDS(g_conf.id, m, &mc.monmap); mds->init(); rank.wait(); diff --git a/src/config.cc b/src/config.cc index bed319bbe984..7944164c3521 100644 --- a/src/config.cc +++ b/src/config.cc @@ -214,6 +214,20 @@ bool parse_ip_port(const char *s, entity_addr_t& a, const char **end) return true; } +bool parse_ip_port_vec(const char *s, vector& vec) +{ + const char *p = s; + const char *end = p + strlen(p); + while (p < end) { + entity_addr_t a; + if (!parse_ip_port(p, a, &p)) + return false; + vec.push_back(a); + } + return true; +} + + void parse_config_option_string(string& s) diff --git a/src/config.h b/src/config.h index a326de07308a..cc3a46b06c15 100644 --- a/src/config.h +++ b/src/config.h @@ -371,6 +371,7 @@ void parse_config_options(std::vector& args); void parse_config_option_string(string& s); extern bool parse_ip_port(const char *s, entity_addr_t& addr, const char **end=0); +extern bool parse_ip_port_vec(const char *s, vector& vec); void generic_server_usage(); void generic_client_usage(); diff --git a/src/cosd.cc b/src/cosd.cc index 0f60346e4ea3..6c49a468dc9f 100644 --- a/src/cosd.cc +++ b/src/cosd.cc @@ -80,18 +80,19 @@ int main(int argc, const char **argv) _dout_create_courtesy_output_symlink("osd", whoami); // get monmap - MonMap monmap; - MonClient mc(&monmap, NULL); - if (!mc.get_monmap()) + MonClient mc; + if (mc.build_initial_monmap() < 0) + return -1; + if (mc.get_monmap() < 0) return -1; if (mkfs) { - int err = OSD::mkfs(g_conf.osd_data, g_conf.osd_journal, monmap.fsid, whoami); + int err = OSD::mkfs(g_conf.osd_data, g_conf.osd_journal, mc.monmap.fsid, whoami); if (err < 0) { cerr << "error creating empty object store in " << g_conf.osd_data << ": " << strerror(-err) << std::endl; exit(1); } - cout << "created object store for osd" << whoami << " fsid " << monmap.fsid << " on " << g_conf.osd_data << std::endl; + cout << "created object store for osd" << whoami << " fsid " << mc.monmap.fsid << " on " << g_conf.osd_data << std::endl; exit(0); } @@ -115,8 +116,8 @@ int main(int argc, const char **argv) cerr << "OSD magic " << magic << " != my " << CEPH_OSD_ONDISK_MAGIC << std::endl; exit(1); } - if (ceph_fsid_compare(&fsid, &monmap.fsid)) { - cerr << "OSD fsid " << fsid << " != monmap fsid " << monmap.fsid << std::endl; + if (ceph_fsid_compare(&fsid, &mc.monmap.fsid)) { + cerr << "OSD fsid " << fsid << " != monmap fsid " << mc.monmap.fsid << std::endl; exit(1); } @@ -128,7 +129,7 @@ int main(int argc, const char **argv) << " at " << rank.get_rank_addr() << " osd_data " << g_conf.osd_data << " " << ((g_conf.osd_journal && g_conf.osd_journal[0]) ? g_conf.osd_journal:"(no journal)") - << " fsid " << monmap.fsid + << " fsid " << mc.monmap.fsid << std::endl; g_timer.shutdown(); @@ -154,7 +155,7 @@ int main(int argc, const char **argv) rank.start(); // start osd - OSD *osd = new OSD(whoami, m, hbm, &monmap, g_conf.osd_data, g_conf.osd_journal); + OSD *osd = new OSD(whoami, m, hbm, &mc.monmap, g_conf.osd_data, g_conf.osd_journal); if (osd->init() < 0) { cout << "error initializing osd" << std::endl; return 1; diff --git a/src/csyn.cc b/src/csyn.cc index e7b93c76344e..1db9ca82bbd5 100644 --- a/src/csyn.cc +++ b/src/csyn.cc @@ -50,9 +50,8 @@ int main(int argc, const char **argv, char *envp[]) if (g_conf.clock_tare) g_clock.tare(); // get monmap - MonMap monmap; - MonClient mc(&monmap, NULL); - if (!mc.get_monmap()) + MonClient mc; + if (mc.build_initial_monmap() < 0) return -1; // start up network @@ -69,7 +68,7 @@ int main(int argc, const char **argv, char *envp[]) cout << "mounting and starting " << g_conf.num_client << " syn client(s)" << std::endl; for (int i=0; iset_client_incarnation(0); diff --git a/src/librados.cc b/src/librados.cc index 1c7093b06f3f..78059c6a8c14 100644 --- a/src/librados.cc +++ b/src/librados.cc @@ -52,7 +52,6 @@ using namespace std; class RadosClient : public Dispatcher { - MonMap monmap; OSDMap osdmap; Messenger *messenger; MonClient monclient; @@ -68,7 +67,7 @@ class RadosClient : public Dispatcher public: - RadosClient() : messenger(NULL), monclient(&monmap, NULL), lock("radosclient") {} + RadosClient() : messenger(NULL), lock("radosclient") {} ~RadosClient(); bool init(); void shutdown(); @@ -266,13 +265,11 @@ public: bool RadosClient::init() { // get monmap - if (!monclient.get_monmap()) + if (monclient.build_initial_monmap() < 0) return false; rank.bind(); - dout(1) << "starting at " << rank.get_rank_addr() - << " fsid " << monmap.get_fsid() - << dendl; + dout(1) << "starting at " << rank.get_rank_addr() << dendl; messenger = rank.register_entity(entity_name_t::CLIENT(-1)); assert_warn(messenger); @@ -290,7 +287,7 @@ bool RadosClient::init() monclient.link_dispatcher(this); - objecter = new Objecter(messenger, &monmap, &osdmap, lock); + objecter = new Objecter(messenger, &monclient.monmap, &osdmap, lock); if (!objecter) return false; diff --git a/src/mon/MonClient.cc b/src/mon/MonClient.cc index dfc822839431..fc0852b5d105 100644 --- a/src/mon/MonClient.cc +++ b/src/mon/MonClient.cc @@ -18,164 +18,113 @@ #undef dout_prefix #define dout_prefix *_dout << dbeginl << "monclient: " -Mutex monmap_lock("monmap_lock"); -Cond monmap_cond; -bufferlist monmap_bl; -int MonClient::probe_mon(MonMap *pmonmap) +/* + * build an initial monmap with any known monitor + * addresses. + */ +int MonClient::build_initial_monmap() { - vector monaddrs; - - const char *p = g_conf.mon_host; - const char *end = p + strlen(p); - while (p < end) { - entity_addr_t a; - if (parse_ip_port(p, a, &p)) { - monaddrs.push_back(a); - } else { - break; + // file? + if (g_conf.monmap) { + const char *monmap_fn = g_conf.monmap; + int r = monmap.read(monmap_fn); + if (r >= 0) + return 0; + cerr << "unable to read monmap from " << monmap_fn << ": " << strerror(errno) << std::endl; + } + + // -m foo? + if (g_conf.mon_host) { + vector addrs; + if (parse_ip_port_vec(g_conf.mon_host, addrs)) { + for (unsigned i=0; iread(monname, "mon addr", &val, 0); + if (!val || !val[0]) + break; + + entity_inst_t inst; + if (!parse_ip_port(val, inst.addr)) { + cerr << "unable to parse conf's addr for " << monname << " (" << val << ")" << std::endl; + continue; + } + inst.name = entity_name_t::MON(monmap.mon_inst.size()); + monmap.add_mon(inst); + } + if (monmap.size()) + return 0; + cerr << "unable to find any monitors in conf" << std::endl; + return -EINVAL; } + cerr << "please specify monitors via -m monaddr or -c ceph.conf" << std::endl; + return -ENOENT; +} + +int MonClient::get_monmap() +{ + dout(10) << "get_monmap" << dendl; + Mutex::Locker l(monc_lock); + SimpleMessenger rank; rank.bind(); - dout(1) << " connecting to monitor(s) at " << monaddrs << " ..." << dendl; Messenger *msgr = rank.register_entity(entity_name_t::CLIENT(-1)); msgr->set_dispatcher(this); - + rank.start(true); // do not daemonize! int attempt = 10; int i = 0; - monmap_lock.Lock(); + srand(getpid()); - while (monmap_bl.length() == 0) { - i = rand() % monaddrs.size(); - dout(10) << "querying " << monaddrs[i] << dendl; - entity_inst_t mi; - mi.addr = monaddrs[i]; - mi.name = entity_name_t::MON(0); // FIXME HRM! - msgr->send_message(new MMonGetMap, mi); + while (monmap.epoch == 0) { + i = rand() % monmap.mon_inst.size(); + dout(10) << "querying " << monmap.mon_inst[i] << dendl; + msgr->send_message(new MMonGetMap, monmap.mon_inst[i]); if (--attempt == 0) break; - + utime_t interval(1, 0); - monmap_cond.WaitInterval(monmap_lock, interval); - } - monmap_lock.Unlock(); - - if (monmap_bl.length()) { - pmonmap->decode(monmap_bl); - dout(1) << "[got monmap from " << monaddrs[i] << " fsid " << pmonmap->fsid << "]" << dendl; + map_cond.WaitInterval(monc_lock, interval); } + msgr->shutdown(); rank.wait(); msgr->destroy(); - if (monmap_bl.length()) + if (monmap.epoch) return 0; - - cerr << "unable to fetch monmap from " << monaddrs << std::endl; - return -1; // failed -} - -MonMap *MonClient::get_monmap() -{ - char *val = 0; - char monname[10]; - - if (g_conf.monmap) { - // file? - const char *monmap_fn = g_conf.monmap; - int r = pmonmap->read(monmap_fn); - if (r >= 0) { - vector::iterator iter = pmonmap->mon_inst.begin(); - unsigned int i; - const sockaddr_in *ipaddr; - entity_addr_t conf_addr; - ConfFile a(g_conf.conf); - ConfFile b("ceph.conf"); - ConfFile *c = 0; - - dout(1) << "[opened monmap at " << monmap_fn << " fsid " << pmonmap->fsid << "]" << dendl; - - if (a.parse()) - c = &a; - else if (b.parse()) - c = &b; - if (c) { - for (i=0; imon_inst.size(); i++) { - ipaddr = &pmonmap->mon_inst[i].addr.ipaddr; - sprintf(monname, "mon%d", i); - if (c->read(monname, "mon addr", &val, 0)) { - if (parse_ip_port(val, conf_addr, NULL)) { - if ((ipaddr->sin_addr.s_addr != conf_addr.ipaddr.sin_addr.s_addr) || - (ipaddr->sin_port != conf_addr.ipaddr.sin_port)) { - cerr << "WARNING: 'mon addr' config option (" << monname << ") does not match monmap file" << std::endl - << " continuing with monmap configuration" << std::endl; - } - } - } - } - } - - return pmonmap; - } - - cerr << "unable to read monmap from " << monmap_fn << ": " << strerror(errno) << std::endl; - } - - if (!g_conf.mon_host) { - // cluster conf? - ConfFile a(g_conf.conf); - ConfFile b("ceph.conf"); - ConfFile *c = 0; - - if (a.parse()) - c = &a; - else if (b.parse()) - c = &b; - if (c) { - static string monstr; - for (int i=0; i<15; i++) { - sprintf(monname, "mon%d", i); - c->read(monname, "mon addr", &val, 0); - if (!val || !val[0]) - break; - - if (monstr.length()) - monstr += ","; - monstr += val; - } - g_conf.mon_host = strdup(monstr.c_str()); - } - } - - // probe? - if (g_conf.mon_host && - probe_mon(pmonmap) == 0) - return pmonmap; - - cerr << "must specify monitor address (-m monaddr) or cluster conf (-c ceph.conf) or monmap file (-M monmap)" << std::endl; - return NULL; + return -1; } -void MonClient::handle_monmap(MMonMap *m) -{ - dout(10) << "handle_monmap " << *m << dendl; - monmap_lock.Lock(); - monmap_bl = m->monmapbl; - monmap_cond.Signal(); - monmap_lock.Unlock(); - delete m; -} bool MonClient::dispatch_impl(Message *m) { @@ -198,6 +147,17 @@ bool MonClient::dispatch_impl(Message *m) return false; } +void MonClient::handle_monmap(MMonMap *m) +{ + dout(10) << "handle_monmap " << *m << dendl; + monc_lock.Lock(); + bufferlist::iterator p = m->monmapbl.begin(); + ::decode(monmap, p); + map_cond.Signal(); + monc_lock.Unlock(); + delete m; +} + // ------------------- @@ -206,10 +166,10 @@ bool MonClient::dispatch_impl(Message *m) void MonClient::_try_mount(double timeout) { dout(10) << "_try_mount" << dendl; - int mon = pmonmap->pick_mon(); + int mon = monmap.pick_mon(); dout(2) << "sending client_mount to mon" << mon << dendl; messenger->set_dispatcher(this); - messenger->send_message(new MClientMount, pmonmap->get_inst(mon)); + messenger->send_message(new MClientMount, monmap.get_inst(mon)); // schedule timeout? assert(mount_timeout_event == 0); @@ -267,8 +227,13 @@ void MonClient::handle_mount_ack(MClientMountAck* m) { dout(10) << "handle_mount_ack " << *m << dendl; + // monmap + bufferlist::iterator p = m->monmap_bl.begin(); + ::decode(monmap, p); + + // ticket signed_ticket = m->signed_ticket; - bufferlist::iterator p = signed_ticket.begin(); + p = signed_ticket.begin(); ::decode(ticket, p); messenger->reset_myname(m->get_dest()); @@ -286,9 +251,9 @@ int MonClient::unmount() // fixme: this should retry and time out too - int mon = pmonmap->pick_mon(); + int mon = monmap.pick_mon(); dout(2) << "sending client_unmount to mon" << mon << dendl; - messenger->send_message(new MClientUnmount, pmonmap->get_inst(mon)); + messenger->send_message(new MClientUnmount, monmap.get_inst(mon)); while (mounted) mount_cond.Wait(monc_lock); diff --git a/src/mon/MonClient.h b/src/mon/MonClient.h index 97001ea23545..8def162f41ad 100644 --- a/src/mon/MonClient.h +++ b/src/mon/MonClient.h @@ -18,6 +18,8 @@ #include "msg/Dispatcher.h" #include "msg/Messenger.h" +#include "MonMap.h" + #include "common/Timer.h" class MonMap; @@ -25,24 +27,26 @@ class MMonMap; class MClientMountAck; class MonClient : public Dispatcher { - MonMap *pmonmap; - Context *mount_timeout_event; +public: + MonMap monmap; +private: Messenger *messenger; + ceph_client_ticket ticket; + bufferlist signed_ticket; + + Context *mount_timeout_event; + Mutex monc_lock; SafeTimer timer; bool mounted; int mounters; bool unmounting; - Cond mount_cond; + Cond mount_cond, map_cond; - ceph_client_ticket ticket; - bufferlist signed_ticket; - int probe_mon(MonMap *pmonmap); - void handle_monmap(MMonMap *m); bool dispatch_impl(Message *m); - + void handle_monmap(MMonMap *m); protected: class C_MountTimeout : public Context { @@ -60,19 +64,40 @@ class MonClient : public Dispatcher { void handle_mount_ack(MClientMountAck* m); void handle_unmount(Message* m); public: - MonClient(MonMap *pmm, Messenger *m) : pmonmap(pmm), messenger(m), - monc_lock("mon_client"), timer(monc_lock) { + MonClient() : messenger(NULL), + monc_lock("MonClient::monc_lock"), + timer(monc_lock) { mounted = false; mounters = 0; mount_timeout_event = 0; unmounting = false; } - MonMap *get_monmap(); + int build_initial_monmap(); + int get_monmap(); int mount(double mount_timeout); int unmount(); + void send_mon_message(Message *m, bool new_mon=false); + + entity_addr_t get_mon_addr(unsigned i) { + Mutex::Locker l(monc_lock); + if (i < monmap.size()) + return monmap.mon_inst[i].addr; + return entity_addr_t(); + } + entity_inst_t get_mon_inst(unsigned i) { + Mutex::Locker l(monc_lock); + if (i < monmap.size()) + return monmap.mon_inst[i]; + return entity_inst_t(); + } + int get_num_mon() { + Mutex::Locker l(monc_lock); + return monmap.size(); + } + void set_messenger(Messenger *m) { messenger = m; } bufferlist& get_signed_ticket() { return signed_ticket; } diff --git a/src/mon/MonMap.h b/src/mon/MonMap.h index 9d0a9101360b..126320345281 100644 --- a/src/mon/MonMap.h +++ b/src/mon/MonMap.h @@ -29,7 +29,9 @@ class MonMap { int last_mon; // last mon i talked to - MonMap(int s=0) : epoch(s?1:0), mon_inst(s), last_mon(-1) { } + MonMap(int s=0) : epoch(s?1:0), mon_inst(s), last_mon(-1) { + memset(&fsid, 0, sizeof(fsid)); + } ceph_fsid_t& get_fsid() { return fsid; } diff --git a/src/testmsgr.cc b/src/testmsgr.cc index 1b0a4b21a99b..9deaccf27169 100644 --- a/src/testmsgr.cc +++ b/src/testmsgr.cc @@ -36,7 +36,6 @@ using namespace std; #include -MonMap monmap; Messenger *messenger = 0; Mutex lock("mylock"); @@ -77,12 +76,12 @@ int main(int argc, const char **argv, const char *envp[]) { dout(0) << "i am mon" << whoami << dendl; // get monmap - MonClient mc(&monmap, NULL); - if (!mc.get_monmap()) + MonClient mc; + if (mc.build_initial_monmap() < 0) return -1; // start up network - g_my_addr = monmap.get_inst(whoami).addr; + g_my_addr = mc.get_mon_addr(whoami); SimpleMessenger rank; int err = rank.bind(); if (err < 0) @@ -110,18 +109,18 @@ int main(int argc, const char **argv, const char *envp[]) { cond.Wait(lock); } - int t = rand() % monmap.size(); + int t = rand() % mc.get_num_mon(); if (t == whoami) continue; if (rand() % 10 == 0) { //cerr << "mark_down " << t << std::endl; dout(0) << "mark_down " << t << dendl; - messenger->mark_down(monmap.get_inst(t).addr); + messenger->mark_down(mc.get_mon_addr(t)); } //cerr << "pinging " << t << std::endl; dout(0) << "pinging " << t << dendl; - messenger->send_message(new MPing, monmap.get_inst(t)); + messenger->send_message(new MPing, mc.get_mon_inst(t)); cerr << isend << "\t" << ++sent << "\t" << received << "\r"; } lock.Unlock();