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();
// 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
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();
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);
monclient.link_dispatcher(this);
- objecter = new Objecter(messenger, &monclient.monmap, &osdmap, lock);
+ objecter = new Objecter(messenger, &monclient, &osdmap, lock);
if (!objecter)
return false;
#include "common/Clock.h"
#include "msg/Messenger.h"
+#include "mon/MonClient.h"
#include "osd/OSDMap.h"
#include "osdc/Objecter.h"
// 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),
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);
{
// 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();
}
// 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();
}
<< 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);
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)) {
// 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));
}
}
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();
}
#include "common/Timer.h"
#include "common/LogClient.h"
-#include "mon/MonMap.h"
#include "MDSMap.h"
#include "SessionMap.h"
class filepath;
+class MonClient;
+
class OSDMap;
class Objecter;
class Filer;
int standby_replay_for;
Messenger *messenger;
- MonMap *monmap;
+ MonClient *monc;
MDSMap *mdsmap;
OSDMap *osdmap;
Objecter *objecter;
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
#include "SnapServer.h"
#include "MDS.h"
#include "osd/OSDMap.h"
+#include "mon/MonClient.h"
#include "include/types.h"
#include "messages/MMDSTableRequest.h"
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;
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) { }
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) { }
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();
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) { }
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"; }
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"; }
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;
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;
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;
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));
}
}
void add_mon(entity_inst_t inst) {
- if (!epoch) epoch = 1;
mon_inst.push_back(inst);
}
#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"
{
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;
}
}
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;
}
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));
}
}
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));
}
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();
}
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();
}
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();
}
class Context;
class Messenger;
class OSDMap;
-class MonMap;
+class MonClient;
class Message;
class MPoolSnapReply;
class Objecter {
public:
Messenger *messenger;
- MonMap *monmap;
+ MonClient *monc;
OSDMap *osdmap;
bufferlist signed_ticket;
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),