void Client::ms_handle_failure(Message *m, const entity_inst_t& inst)
{
- msg_addr_t dest = inst.name;
+ entity_name_t dest = inst.name;
if (dest.is_mon()) {
// resend to a different monitor.
#include "MDSMonitor.h"
#include "Monitor.h"
+#include "MonitorStore.h"
#include "messages/MMDSMap.h"
#include "messages/MMDSGetMap.h"
/********* MDS map **************/
-void MDSMonitor::create_initial()
-{
- mdsmap.epoch = 0; // until everyone boots
- mdsmap.ctime = g_clock.now();
-
- print_map();
-}
-
void MDSMonitor::dispatch(Message *m)
{
switch (m->get_type()) {
}
}
+
+
+void MDSMonitor::election_finished()
+{
+ if (mon->is_leader()) {
+
+ // FIXME be smarter later.
+
+ if (g_conf.mkfs) {
+ create_initial();
+ save_map();
+ } else {
+ load_map();
+ }
+ }
+}
+
+
+void MDSMonitor::create_initial()
+{
+ mdsmap.epoch = 0; // until everyone boots
+ mdsmap.ctime = g_clock.now();
+
+ mdsmap.encode(encoded_map);
+
+ print_map();
+}
+
+void MDSMonitor::load_map()
+{
+ int r = mon->store->get_bl_ss(encoded_map, "mdsmap", "current");
+ assert(r > 0);
+ mdsmap.decode(encoded_map);
+ dout(7) << "load_map epoch " << mdsmap.get_epoch() << endl;
+}
+
+void MDSMonitor::save_map()
+{
+ dout(7) << "save_map epoch " << mdsmap.get_epoch() << endl;
+
+ int r = mon->store->put_bl_ss(encoded_map, "mdsmap", "current");
+ assert(r>=0);
+}
+
void MDSMonitor::print_map()
{
dout(7) << "print_map epoch " << mdsmap.get_epoch() << endl;
}
+void MDSMonitor::issue_map()
+{
+ mdsmap.inc_epoch();
+ mdsmap.encode(encoded_map);
+
+ dout(7) << "issue_map epoch " << mdsmap.get_epoch() << endl;
+
+ save_map();
+ print_map();
+
+ // bcast map
+ bcast_latest_mds();
+ send_current();
+}
+
void MDSMonitor::handle_mds_beacon(MMDSBeacon *m)
{
else
mdsmap.mds_state_seq.erase(from);
- // inc map version
- mdsmap.inc_epoch();
- mdsmap.encode(maps[mdsmap.get_epoch()]);
-
- print_map();
-
- // bcast map
- bcast_latest_mds();
- send_current();
+ issue_map();
}
delete m;
}
if (changed) {
- mdsmap.inc_epoch();
- mdsmap.encode(maps[mdsmap.get_epoch()]);
-
- print_map();
-
- // bcast map
- bcast_latest_mds();
- send_current();
+ issue_map();
}
}
}
MDSMap mdsmap;
private:
- map<epoch_t, bufferlist> maps;
+ bufferlist encoded_map;
//map<epoch_t, bufferlist> inc_maps;
//MDSMap::Incremental pending_inc;
void send_full(entity_inst_t dest);
void bcast_latest_mds();
+ void issue_map();
+
+ void save_map();
+ void load_map();
void print_map();
//void accept_pending(); // accept pending, new map.
public:
MDSMonitor(Monitor *mn, Messenger *m, Mutex& l) : mon(mn), messenger(m), lock(l) {
- create_initial();
}
void dispatch(Message *m);
void tick(); // check state, take actions
+ void election_starting();
+ void election_finished();
+
void send_latest(entity_inst_t dest);
};
if (g_conf.mkfs)
store->mkfs();
+ else
+ store->mount();
// create
osdmon = new OSDMonitor(this, messenger, lock);
// init
osdmon->election_finished();
- //mdsmon->election_finished();
+ mdsmon->election_finished();
// init paxos
test_paxos.leader_start();
#include <fcntl.h>
-void MonitorStore::init()
+void MonitorStore::mount()
{
- dout(1) << "init" << endl;
+ dout(1) << "mount" << endl;
// verify dir exists
DIR *d = ::opendir(dir.c_str());
if (!d) {
dout(1) << "mkfs" << endl;
char cmd[200];
- sprintf(cmd, "/bin/rm -r %s ; mkdir %s", dir.c_str(), dir.c_str());
+ sprintf(cmd, "test -d %s && /bin/rm -r %s ; mkdir -p %s", dir.c_str(), dir.c_str(), dir.c_str());
dout(1) << cmd << endl;
system(cmd);
}
// ----------------------------------------
// buffers
-bool MonitorStore::exists_bl(const char *a, const char *b)
+bool MonitorStore::exists_bl_ss(const char *a, const char *b)
{
char fn[200];
if (b) {
}
-int MonitorStore::get_bl(bufferlist& bl, const char *a, const char *b)
+int MonitorStore::get_bl_ss(bufferlist& bl, const char *a, const char *b)
{
char fn[200];
if (b) {
return len;
}
-int MonitorStore::put_bl(bufferlist& bl, const char *a, const char *b)
+int MonitorStore::put_bl_ss(bufferlist& bl, const char *a, const char *b)
{
char fn[200];
sprintf(fn, "%s/%s", dir.c_str(), a);
class MonitorStore {
string dir;
- void init();
-
public:
MonitorStore(char *d) : dir(d) {
- init();
}
~MonitorStore() {
}
void mkfs(); // wipe
+ void mount();
// ints (stored as ascii)
version_t get_int(const char *a, const char *b=0);
void put_int(version_t v, const char *a, const char *b=0);
// buffers
- bool exists_bl(const char *a, const char *b=0);
- int get_bl(bufferlist& bl, const char *a, const char *b);
- int put_bl(bufferlist& bl, const char *a, const char *b);
- bool exists_bl(const char *a, unsigned b) {
- char bs[16];
- sprintf(bs, "%0u", b);
- return exists_bl(a, bs);
+ // ss and sn varieties.
+ bool exists_bl_ss(const char *a, const char *b=0);
+ int get_bl_ss(bufferlist& bl, const char *a, const char *b);
+ int put_bl_ss(bufferlist& bl, const char *a, const char *b);
+ bool exists_bl_sn(const char *a, version_t b) {
+ char bs[20];
+ sprintf(bs, "%llu", b);
+ return exists_bl_ss(a, bs);
}
- int get_bl(bufferlist& bl, const char *a, version_t b) {
- char bs[16];
- sprintf(bs, "%0llu", b);
- return get_bl(bl, a, bs);
+ int get_bl_sn(bufferlist& bl, const char *a, version_t b) {
+ char bs[20];
+ sprintf(bs, "%llu", b);
+ return get_bl_ss(bl, a, bs);
}
- int put_bl(bufferlist& bl, const char *a, version_t b) {
- char bs[16];
- sprintf(bs, "%0llu", b);
- return put_bl(bl, a, bs);
+ int put_bl_sn(bufferlist& bl, const char *a, version_t b) {
+ char bs[20];
+ sprintf(bs, "%llu", b);
+ return put_bl_ss(bl, a, bs);
}
/*
+/*
void OSDMonitor::init()
{
// start with blank map
pending_inc.epoch = osdmap.get_epoch()+1;
}
}
+*/
bool OSDMonitor::get_map_bl(epoch_t epoch, bufferlist& bl)
{
- if (!mon->store->exists_bl("osdmap", epoch))
+ if (!mon->store->exists_bl_sn("osdmap", epoch))
return false;
- int r = mon->store->get_bl(bl, "osdmap", epoch);
+ int r = mon->store->get_bl_sn(bl, "osdmap", epoch);
assert(r > 0);
return true;
}
bool OSDMonitor::get_inc_map_bl(epoch_t epoch, bufferlist& bl)
{
- if (!mon->store->exists_bl("osdincmap", epoch))
+ if (!mon->store->exists_bl_sn("osdincmap", epoch))
return false;
- int r = mon->store->get_bl(bl, "osdincmap", epoch);
+ int r = mon->store->get_bl_sn(bl, "osdincmap", epoch);
assert(r > 0);
return true;
}
bufferlist bl;
osdmap.encode(bl);
- mon->store->put_bl(bl, "osdmap", osdmap.get_epoch());
+ mon->store->put_bl_sn(bl, "osdmap", osdmap.get_epoch());
mon->store->put_int(osdmap.get_epoch(), "osd_epoch");
}
bufferlist incbl;
inc.encode(incbl);
- mon->store->put_bl(bl, "osdmap", osdmap.get_epoch());
- mon->store->put_bl(incbl, "osdincmap", osdmap.get_epoch());
+ mon->store->put_bl_sn(bl, "osdmap", osdmap.get_epoch());
+ mon->store->put_bl_sn(incbl, "osdincmap", osdmap.get_epoch());
mon->store->put_int(osdmap.get_epoch(), "osd_epoch");
}
{
dout(10) << "election_finished" << endl;
+ if (mon->is_leader()) {
+ if (g_conf.mkfs) {
+ create_initial();
+ save_map();
+ } else {
+ //
+ epoch_t epoch = mon->store->get_int("osd_epoch");
+ dout(10) << " last epoch was " << epoch << endl;
+ bufferlist bl, blinc;
+ int r = mon->store->get_bl_sn(bl, "osdmap", epoch);
+ assert(r>0);
+ osdmap.decode(bl);
+
+ // pending_inc
+ pending_inc.epoch = epoch+1;
+ }
+
+ }
+
+ /*
state = STATE_INIT;
// map?
//messenger->send_message(new MMonOSDMapInfo(osdmap.epoch, osdmap.mon_epoch),
// mon->monmap->get_inst(mon->leader));
}
-
+ */
}
int state;
utime_t lease_expire; // when lease expires
- void init();
+ //void init();
// maps
void accept_pending(); // accept pending, new map.
OSDMonitor(Monitor *mn, Messenger *m, Mutex& l) :
mon(mn), messenger(m), lock(l),
state(STATE_SYNC) {
- init();
+ //init();
}
void dispatch(Message *m);