]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds, objecter, ceph: use MonClient
authorSage Weil <sage@newdream.net>
Fri, 26 Jun 2009 21:12:56 +0000 (14:12 -0700)
committerSage Weil <sage@newdream.net>
Fri, 26 Jun 2009 22:10:27 +0000 (15:10 -0700)
19 files changed:
src/ceph.cc
src/client/Client.cc
src/cmds.cc
src/dumpjournal.cc
src/librados.cc
src/mds/MDS.cc
src/mds/MDS.h
src/mds/SnapServer.cc
src/messages/MGetPoolStats.h
src/messages/MMDSBeacon.h
src/messages/MMDSMap.h
src/messages/MOSDGetMap.h
src/messages/MPoolSnap.h
src/messages/MStatfs.h
src/mon/MonClient.cc
src/mon/MonClient.h
src/mon/MonMap.h
src/osdc/Objecter.cc
src/osdc/Objecter.h

index 8b9415333c6d88d1d76a0063ab7844517f0d2f56..975372efb163595dbe7c3c58ae09caf52b186055 100644 (file)
@@ -630,6 +630,9 @@ int main(int argc, const char **argv, const char *envp[])
   rank.start();
   rank.set_policy(entity_name_t::TYPE_MON, SimpleMessenger::Policy::lossy_fail_after(1.0));
 
+  if (mc.get_monmap() < 0)
+    return -1;
+
   if (watch) {
     lock.Lock();
     get_status();
index ce1704afcba0977daef764b97b3bd1e9ceea2d71..6e72c5948d6ee6d364c89372ea3afa40e9b41c01 100644 (file)
@@ -133,7 +133,7 @@ Client::Client(Messenger *m, MonClient *mc) : timer(client_lock), client_lock("C
   // osd interfaces
   osdmap = new OSDMap;     // initially blank.. see mount()
   mdsmap = new MDSMap;
-  objecter = new Objecter(messenger, &monclient->monmap, osdmap, client_lock);
+  objecter = new Objecter(messenger, monclient, osdmap, client_lock);
   objecter->set_client_incarnation(0);  // client always 0, for now.
   objectcacher = new ObjectCacher(objecter, client_lock, 
                                  0,                            // all ack callback
index aaa453fafd4ca8ba5b44855f157dc57c51298a19..5f6a56099ada312c1eb5aa9f594ade91a29fae31 100644 (file)
@@ -86,7 +86,7 @@ int main(int argc, const char **argv)
   rank.start();
   
   // start mds
-  MDS *mds = new MDS(g_conf.id, m, &mc.monmap);
+  MDS *mds = new MDS(g_conf.id, m, &mc);
   mds->init();
   
   rank.wait();
index 7c39b37ce1922d415960357298a04d0857872c21..5906565f1f5594993c0c2c53e9552395d44ec079 100644 (file)
@@ -97,7 +97,7 @@ int main(int argc, const char **argv, const char *envp[])
   inodeno_t ino = MDS_INO_LOG_OFFSET + mds;
   unsigned pg_pool = CEPH_METADATA_RULE;
 
-  objecter = new Objecter(messenger, &mc.monmap, &osdmap, lock);
+  objecter = new Objecter(messenger, &mc, &osdmap, lock);
   journaler = new Journaler(ino, pg_pool, CEPH_FS_ONDISK_MAGIC, objecter, 0, 0,  &lock);
 
   objecter->set_client_incarnation(0);
index 78059c6a8c14d25e88cf279951b04f4ceb231995..dd0f37ecd62a42542ccfd2fa4f8cd9b8fe8c56f4 100644 (file)
@@ -287,7 +287,7 @@ bool RadosClient::init()
 
   monclient.link_dispatcher(this);
 
-  objecter = new Objecter(messenger, &monclient.monmap, &osdmap, lock);
+  objecter = new Objecter(messenger, &monclient, &osdmap, lock);
   if (!objecter)
     return false;
 
index 212694aa1bce61738c48f2a3e357cd035bf265a4..63308bc7580dd5ea33c0f29fbd9cc26ec49be287 100644 (file)
@@ -18,6 +18,7 @@
 #include "common/Clock.h"
 
 #include "msg/Messenger.h"
+#include "mon/MonClient.h"
 
 #include "osd/OSDMap.h"
 #include "osdc/Objecter.h"
@@ -71,7 +72,7 @@
 
 
 // cons/des
-MDS::MDS(const char *n, Messenger *m, MonMap *mm) : 
+MDS::MDS(const char *n, Messenger *m, MonClient *mc) : 
   mds_lock("MDS::mds_lock"),
   timer(mds_lock),
   name(n),
@@ -79,16 +80,18 @@ MDS::MDS(const char *n, Messenger *m, MonMap *mm) :
   standby_for_rank(-1),
   standby_replay_for(-1),
   messenger(m),
-  monmap(mm),
-  logclient(messenger, monmap),
+  monc(mc),
+  logclient(messenger, &mc->monmap),
   sessionmap(this) {
 
   last_tid = 0;
 
+  monc->set_messenger(messenger);
+
   mdsmap = new MDSMap;
   osdmap = new OSDMap;
 
-  objecter = new Objecter(messenger, monmap, osdmap, mds_lock);
+  objecter = new Objecter(messenger, monc, osdmap, mds_lock);
   filer = new Filer(objecter);
 
   mdcache = new MDCache(this);
@@ -299,7 +302,7 @@ void MDS::send_message_mds(Message *m, int mds)
 {
   // send mdsmap first?
   if (peer_mdsmap_epoch[mds] < mdsmap->get_epoch()) {
-    messenger->send_message(new MMDSMap(monmap->fsid, mdsmap), 
+    messenger->send_message(new MMDSMap(monc->get_fsid(), mdsmap), 
                            mdsmap->get_inst(mds));
     peer_mdsmap_epoch[mds] = mdsmap->get_epoch();
   }
@@ -337,7 +340,7 @@ void MDS::forward_message_mds(Message *m, int mds)
 
   // send mdsmap first?
   if (peer_mdsmap_epoch[mds] < mdsmap->get_epoch()) {
-    messenger->send_message(new MMDSMap(monmap->fsid, mdsmap), 
+    messenger->send_message(new MMDSMap(monc->get_fsid(), mdsmap), 
                            mdsmap->get_inst(mds));
     peer_mdsmap_epoch[mds] = mdsmap->get_epoch();
   }
@@ -477,15 +480,16 @@ void MDS::beacon_send()
           << dendl;
 
   // pick new random mon if we have any outstanding beacons...
-  int mon = monmap->pick_mon(beacon_seq_stamp.size());
+  bool newmon = beacon_seq_stamp.size();
 
   beacon_seq_stamp[beacon_last_seq] = g_clock.now();
   
-  MMDSBeacon *beacon = new MMDSBeacon(monmap->fsid, name, mdsmap->get_epoch(), 
+  MMDSBeacon *beacon = new MMDSBeacon(monc->get_fsid(), name, mdsmap->get_epoch(), 
                                      want_state, beacon_last_seq);
   beacon->set_standby_for_rank(standby_for_rank);
   beacon->set_standby_for_name(standby_for_name);
-  messenger->send_message(beacon, monmap->get_inst(mon));
+
+  monc->send_mon_message(beacon, newmon);
 
   // schedule next sender
   if (beacon_sender) timer.cancel_event(beacon_sender);
@@ -500,7 +504,7 @@ void MDS::handle_mds_beacon(MMDSBeacon *m)
   version_t seq = m->get_seq();
 
   // make note of which mon 
-  monmap->last_mon = m->get_source().num();
+  monc->note_mon_leader(m->get_source().num());
 
   // update lab
   if (beacon_seq_stamp.count(seq)) {
@@ -631,9 +635,7 @@ void MDS::handle_mds_map(MMDSMap *m)
     // do i need an osdmap?
     if (oldwhoami < 0) {
       // we need an osdmap too.
-      int mon = monmap->pick_mon();
-      messenger->send_message(new MOSDGetMap(monmap->fsid, 0),
-                             monmap->get_inst(mon));
+      monc->send_mon_message(new MOSDGetMap(monc->get_fsid(), 0));
     }
   }
 
@@ -764,7 +766,7 @@ void MDS::bcast_mds_map()
   for (set<Session*>::const_iterator p = clients.begin();
        p != clients.end();
        ++p) 
-    messenger->send_message(new MMDSMap(monmap->fsid, mdsmap), (*p)->inst);
+    messenger->send_message(new MMDSMap(monc->get_fsid(), mdsmap), (*p)->inst);
   last_client_mdsmap_bcast = mdsmap->get_epoch();
 }
 
index 1ff4f8c245c1832161e775c64ac5dc2c46f9f663..80a8bf66a042e28a3ef2fa14185e0280260c31eb 100644 (file)
@@ -29,7 +29,6 @@
 #include "common/Timer.h"
 #include "common/LogClient.h"
 
-#include "mon/MonMap.h"
 #include "MDSMap.h"
 
 #include "SessionMap.h"
@@ -104,6 +103,8 @@ enum {
 
 class filepath;
 
+class MonClient;
+
 class OSDMap;
 class Objecter;
 class Filer;
@@ -149,7 +150,7 @@ class MDS : public Dispatcher {
   int standby_replay_for;
 
   Messenger    *messenger;
-  MonMap       *monmap;
+  MonClient    *monc;
   MDSMap       *mdsmap;
   OSDMap       *osdmap;
   Objecter     *objecter;
@@ -292,7 +293,7 @@ class MDS : public Dispatcher {
  private:
   virtual bool dispatch_impl(Message *m);
  public:
-  MDS(const char *n, Messenger *m, MonMap *mm);
+  MDS(const char *n, Messenger *m, MonClient *mc);
   ~MDS();
 
   // who am i etc
index e4d06cc9d50c66759a285ec2e45ef4e56f448fa3..70a54d97b3d90eaee5846adb86ca105a13fddf19 100644 (file)
@@ -15,6 +15,7 @@
 #include "SnapServer.h"
 #include "MDS.h"
 #include "osd/OSDMap.h"
+#include "mon/MonClient.h"
 
 #include "include/types.h"
 #include "messages/MMDSTableRequest.h"
@@ -249,8 +250,7 @@ void SnapServer::check_osd_map(bool force)
   if (!all_purge.empty()) {
     dout(10) << "requesting removal of " << all_purge << dendl;
     MRemoveSnaps *m = new MRemoveSnaps(all_purge);
-    int mon = mds->monmap->pick_mon();
-    mds->messenger->send_message(m, mds->monmap->get_inst(mon));
+    mds->monc->send_mon_message(m);
   }
 
   last_checked_osdmap = version;
index 47529458a611171dbc525a4f71deef7ccce6defa..0b2664205469f840db6735a5054959225973d5de 100644 (file)
@@ -25,7 +25,7 @@ public:
   vector<string> pools;
 
   MGetPoolStats() : PaxosServiceMessage(MSG_GETPOOLSTATS, 0) {}
-  MGetPoolStats(ceph_fsid_t& f, tid_t t, vector<string>& ls, version_t l) :
+  MGetPoolStats(const ceph_fsid_t& f, tid_t t, vector<string>& ls, version_t l) :
     PaxosServiceMessage(MSG_GETPOOLSTATS, l),
     fsid(f), tid(t), pools(ls) { }
 
index 1025e2b835c8c2131e3939604180876ced2f04ac..ec0d27ed2165752c9d75c8ff9730952b17b2060a 100644 (file)
@@ -32,7 +32,7 @@ class MMDSBeacon : public PaxosServiceMessage {
 
  public:
   MMDSBeacon() : PaxosServiceMessage(MSG_MDS_BEACON, 0) {}
-  MMDSBeacon(ceph_fsid_t &f, string& n, epoch_t les, int st, version_t se) : 
+  MMDSBeacon(const ceph_fsid_t &f, string& n, epoch_t les, int st, version_t se) : 
     PaxosServiceMessage(MSG_MDS_BEACON, les), 
     fsid(f), name(n), state(st), seq(se),
     standby_for_rank(-1) { }
index bcd0166b2e091ca47bf48bf963bbee026563db3f..b307ef39f3702eac2dcb6159c264356e01cb3e13 100644 (file)
@@ -54,7 +54,7 @@ class MMDSMap : public Message {
 
   MMDSMap() : 
     Message(CEPH_MSG_MDS_MAP) {}
-  MMDSMap(ceph_fsid_t &f, MDSMap *mm) :
+  MMDSMap(const ceph_fsid_t &f, MDSMap *mm) :
     Message(CEPH_MSG_MDS_MAP),
     fsid(f) {
     epoch = mm->get_epoch();
index 2506e5b5297fca573bc6beb6b7cd819a56e17382..e0ac5a1b7abac74ac9b7e13a5bf244cfa82e35be 100644 (file)
@@ -25,7 +25,7 @@ class MOSDGetMap : public PaxosServiceMessage {
   epoch_t start;  // this is the first incremental the sender wants (he has start-1)
 
   MOSDGetMap() : PaxosServiceMessage(CEPH_MSG_OSD_GETMAP, 0) {}
-  MOSDGetMap(ceph_fsid_t& f, epoch_t s=0) : 
+  MOSDGetMap(const ceph_fsid_t& f, epoch_t s=0) : 
     PaxosServiceMessage(CEPH_MSG_OSD_GETMAP, s>0 ? s-1 : 0),
     fsid(f), start(s) { }
 
index 4d1b8445c3c8427dd0f3843cbf96ae5d0e84a51b..806707b30145984ef3ab1994590a6bebd491b42e 100644 (file)
@@ -27,7 +27,7 @@ public:
   bool create;
 
   MPoolSnap() : PaxosServiceMessage(MSG_POOLSNAP, 0) {}
-  MPoolSnap( ceph_fsid_t& f, tid_t t, int p, string& n, bool c, version_t v) :
+  MPoolSnap(const ceph_fsid_t& f, tid_t t, int p, string& n, bool c, version_t v) :
     PaxosServiceMessage(MSG_POOLSNAP, v), fsid(f), tid(t), pool(p), name(n), create(c) {}
 
   const char *get_type_name() { return "poolsnap"; }
index 3204cd872dfa99ceec864614d0886b3a19344e5d..253520c695573a6792ae5f1b707c01339ad51ea7 100644 (file)
@@ -25,7 +25,7 @@ public:
   tid_t tid;
 
   MStatfs() : PaxosServiceMessage(CEPH_MSG_STATFS, 0) {}
-  MStatfs(ceph_fsid_t& f, tid_t t, version_t v) :
+  MStatfs(const ceph_fsid_t& f, tid_t t, version_t v) :
     PaxosServiceMessage(CEPH_MSG_STATFS, v), fsid(f), tid(t) {}
 
   const char *get_type_name() { return "statfs"; }
index 9f7752051e9784b1c93c73b0c8ad28d9f0db3861..ab453dea7e37267fb4f3a4ef29811907ad42e400 100644 (file)
@@ -91,23 +91,27 @@ int MonClient::get_monmap()
   dout(10) << "get_monmap" << dendl;
   Mutex::Locker l(monc_lock);
   
-  SimpleMessenger rank; 
-
-  rank.bind();
-  
-  Messenger *msgr = rank.register_entity(entity_name_t::CLIENT(-1));
-  msgr->set_dispatcher(this);
-  
-  rank.start(true);  // do not daemonize!
+  SimpleMessenger *rank; 
+  bool temp_msgr = false;
+  if (!messenger) {
+    rank = new SimpleMessenger;
+    rank->bind();
+    messenger = rank->register_entity(entity_name_t::CLIENT(-1));
+    messenger->set_dispatcher(this);
+    rank->start(true);  // do not daemonize!
+    temp_msgr = true; 
+  }
   
   int attempt = 10;
   int i = 0;
 
   srand(getpid());
+  dout(10) << "have " << monmap.epoch << dendl;
+    
   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]);
+    messenger->send_message(new MMonGetMap, monmap.mon_inst[i]);
     
     if (--attempt == 0)
       break;
@@ -116,9 +120,12 @@ int MonClient::get_monmap()
     map_cond.WaitInterval(monc_lock, interval);
   }
   
-  msgr->shutdown();
-  rank.wait();
-  msgr->destroy();
+  if (temp_msgr) {
+    messenger->shutdown();
+    rank->wait();
+    messenger->destroy();
+    messenger = 0;
+  }
 
   if (monmap.epoch)
     return 0;
index 4b34c4c2ba0544a7025e0272398dfe3437d40c45..2f80ae9df7a9d98a942765c665795400cb21a89b 100644 (file)
@@ -80,6 +80,9 @@ private:
   int unmount();
 
   void send_mon_message(Message *m, bool new_mon=false);
+  void note_mon_leader(int m) {
+    monmap.last_mon = m;
+  }
 
   const ceph_fsid_t& get_fsid() {
     return monmap.fsid;
index 126320345281375e33fd299fbcd0a9960a52f1e5..231ebeab4028197487bea22160b112a4402a6d28 100644 (file)
@@ -29,7 +29,7 @@ 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() : epoch(0), last_mon(-1) {
     memset(&fsid, 0, sizeof(fsid));
   }
 
@@ -40,7 +40,6 @@ class MonMap {
   }
 
   void add_mon(entity_inst_t inst) {
-    if (!epoch) epoch = 1;
     mon_inst.push_back(inst);
   }
 
index 03926140bad0c7249ddea0cd6307253aa049437a..81ba990298e318d7b2834809c187b2e419256046 100644 (file)
@@ -15,7 +15,8 @@
 #include "Objecter.h"
 #include "osd/OSDMap.h"
 #include "osd/PGLS.h"
-#include "mon/MonMap.h"
+
+#include "mon/MonClient.h"
 
 #include "msg/Messenger.h"
 #include "msg/Message.h"
@@ -94,8 +95,8 @@ void Objecter::handle_osd_map(MOSDMap *m)
 {
   assert(osdmap); 
 
-  if (ceph_fsid_compare(&m->fsid, &monmap->fsid)) {
-    dout(0) << "handle_osd_map fsid " << m->fsid << " != " << monmap->fsid << dendl;
+  if (ceph_fsid_compare(&m->fsid, &monc->get_fsid())) {
+    dout(0) << "handle_osd_map fsid " << m->fsid << " != " << monc->get_fsid() << dendl;
     delete m;
     return;
   }
@@ -140,9 +141,7 @@ void Objecter::handle_osd_map(MOSDMap *m)
        }
        else {
          dout(3) << "handle_osd_map requesting missing epoch " << osdmap->get_epoch()+1 << dendl;
-         int mon = monmap->pick_mon();
-         messenger->send_message(new MOSDGetMap(monmap->fsid, osdmap->get_epoch()+1), 
-                                 monmap->get_inst(mon));
+         monc->send_mon_message(new MOSDGetMap(monc->get_fsid(), osdmap->get_epoch()+1));
          break;
        }
        
@@ -174,9 +173,7 @@ void Objecter::handle_osd_map(MOSDMap *m)
        scan_pgs(changed_pgs);
       } else {
        dout(3) << "handle_osd_map hmm, i want a full map, requesting" << dendl;
-       int mon = monmap->pick_mon();
-       messenger->send_message(new MOSDGetMap(monmap->fsid, 0),
-                               monmap->get_inst(mon));
+       monc->send_mon_message(new MOSDGetMap(monc->get_fsid(), 0));
       }
     }
 
@@ -209,8 +206,7 @@ void Objecter::maybe_request_map()
   dout(10) << "maybe_request_map requesting next osd map" << dendl;
   last_epoch_requested_stamp = now;
   last_epoch_requested = osdmap->get_epoch()+1;
-  messenger->send_message(new MOSDGetMap(monmap->fsid, last_epoch_requested),
-                         monmap->get_inst(monmap->pick_mon()));
+  monc->send_mon_message(new MOSDGetMap(monc->get_fsid(), last_epoch_requested));
 }
 
 
@@ -689,10 +685,8 @@ void Objecter::delete_pool_snap(int *reply, int pool, string& snapName, Context
 
 void Objecter::pool_snap_submit(SnapOp *op) {
   dout(10) << "pool_snap_submit " << op->tid << dendl;
-  MPoolSnap *m = new MPoolSnap(monmap->fsid, op->tid, op->pool,
-                              op->name, op->create, last_seen_version);
-  int mon = monmap->pick_mon();
-  messenger->send_message(m, monmap->get_inst(mon));
+  monc->send_mon_message(new MPoolSnap(monc->get_fsid(), op->tid, op->pool,
+                                      op->name, op->create, last_seen_version));
   op->last_submit = g_clock.now();
 }
 
@@ -744,9 +738,7 @@ void Objecter::get_pool_stats(vector<string>& pools, map<string,pool_stat_t> *re
 void Objecter::poolstat_submit(PoolStatOp *op)
 {
   dout(10) << "poolstat_submit " << op->tid << dendl;
-  MGetPoolStats *m = new MGetPoolStats(monmap->fsid, op->tid, op->pools, last_seen_version);
-  int mon = monmap->pick_mon();
-  messenger->send_message(m, monmap->get_inst(mon));
+  monc->send_mon_message(new MGetPoolStats(monc->get_fsid(), op->tid, op->pools, last_seen_version));
   op->last_submit = g_clock.now();
 }
 
@@ -785,11 +777,10 @@ void Objecter::get_fs_stats(ceph_statfs& result, Context *onfinish) {
   fs_stats_submit(op);
 }
 
-void Objecter::fs_stats_submit(StatfsOp *op) {
+void Objecter::fs_stats_submit(StatfsOp *op)
+{
   dout(10) << "fs_stats_submit" << op->tid << dendl;
-  MStatfs *m = new MStatfs(monmap->fsid, op->tid, last_seen_version);
-  int mon = monmap->pick_mon();
-  messenger->send_message(m, monmap->get_inst(mon));
+  monc->send_mon_message(new MStatfs(monc->get_fsid(), op->tid, last_seen_version));
   op->last_submit = g_clock.now();
 }
 
index 6c9978e567893deb4cfc156cf289f085bae5d50f..7468e7ead0bcb5212acefce6e9cd2c4458fe3414 100644 (file)
@@ -32,7 +32,7 @@ using namespace __gnu_cxx;
 class Context;
 class Messenger;
 class OSDMap;
-class MonMap;
+class MonClient;
 class Message;
 
 class MPoolSnapReply;
@@ -174,7 +174,7 @@ struct ObjectOperation {
 class Objecter {
  public:  
   Messenger *messenger;
-  MonMap    *monmap;
+  MonClient *monc;
   OSDMap    *osdmap;
 
   bufferlist signed_ticket;
@@ -375,8 +375,8 @@ class Objecter {
 
 
  public:
-  Objecter(Messenger *m, MonMap *mm, OSDMap *om, Mutex& l) : 
-    messenger(m), monmap(mm), osdmap(om),
+  Objecter(Messenger *m, MonClient *mc, OSDMap *om, Mutex& l) : 
+    messenger(m), monc(mc), osdmap(om),
     last_tid(0), client_inc(-1),
     num_unacked(0), num_uncommitted(0),
     last_epoch_requested(0),