class MClientBoot : public Message {
public:
- MClientBoot() : Message(MSG_CLIENT_BOOT) {
- }
+ MClientBoot() : Message(MSG_CLIENT_BOOT) { }
- char *get_type_name() { return "Cboot"; }
+ char *get_type_name() { return "ClientBoot"; }
- virtual void decode_payload(crope& s, int& off) {
- }
- virtual void encode_payload(crope& s) {
- }
+ void encode_payload() { }
+ void decode_payload() { }
};
#endif
MMonElectionAck() : Message(MSG_MON_ELECTION_ACK) {}
virtual char *get_type_name() { return "election_ack"; }
+
+ void encode_payload() {}
+ void decode_payload() {}
};
#endif
MMonElectionPropose() : Message(MSG_MON_ELECTION_PROPOSE) {}
virtual char *get_type_name() { return "election_propose"; }
+
+ void encode_payload() {}
+ void decode_payload() {}
+
};
#endif
virtual char *get_type_name() { return "election_victory"; }
- /*
void encode_payload() {
- ::_encode(active_set, payload);
+ //::_encode(active_set, payload);
}
void decode_payload() {
- int off = 0;
- ::_decode(active_set, payload, off);
+ //int off = 0;
+ //::_decode(active_set, payload, off);
}
- */
};
#endif
}
// copy into inst
+ memset(&tcpaddr, 0, sizeof(addr));
+ tcpaddr.sin_family = AF_INET;
memcpy((char*)&tcpaddr.sin_addr.s_addr, (char*)addr, 4);
- tcpaddr.sin_port = port;
+ tcpaddr.sin_port = htons(port);
return true;
}
cerr << "mkmonmap: invalid ip:port '" << args[i] << "'" << endl;
return -1;
}
+
entity_inst_t inst;
inst.set_addr(addr);
cout << "mkmonmap: mon" << monmap.num_mon << " " << inst << endl;
#include "config.h"
#undef dout
-#define dout(l) if (l<=g_conf.debug || l<=g_conf.debug_mon) cout << "mon" << whoami << " "
-#define derr(l) if (l<=g_conf.debug || l<=g_conf.debug_mon) cerr << "mon" << whoami << " "
+#define derr(l) if (l<=g_conf.debug || l<=g_conf.debug_mon) cerr << g_clock.now() << " mon" << mon->whoami << (mon->is_starting() ? (const char*)"(starting)":(mon->is_leader() ? (const char*)"(leader)":(mon->is_peon() ? (const char*)"(peon)":(const char*)"(?\?)"))) << ".elector "
+#define dout(l) if (l<=g_conf.debug || l<=g_conf.debug_mon) cout << g_clock.now() << " mon" << mon->whoami << (mon->is_starting() ? (const char*)"(starting)":(mon->is_leader() ? (const char*)"(leader)":(mon->is_peon() ? (const char*)"(peon)":(const char*)"(?\?)"))) << ".elector "
void Elector::start()
void Elector::defer(int who)
{
- dout(5) << "defer -- i'm deferring to " << who << endl;
+ dout(5) << "defer to " << who << endl;
if (electing_me) {
acked_me.clear();
void Elector::victory()
{
+ leader_acked = -1;
+ electing_me = false;
+
// tell everyone
for (unsigned i=0; i<mon->monmap->num_mon; ++i) {
if (i == whoami) continue;
void Elector::handle_propose(MMonElectionPropose *m)
{
- dout(5) << "propose from " << m->get_source() << endl;
+ dout(5) << "handle_propose from " << m->get_source() << endl;
int from = m->get_source().num();
if (from > whoami) {
void Elector::handle_ack(MMonElectionAck *m)
{
- dout(5) << "ack from " << m->get_source() << endl;
+ dout(5) << "handle_ack from " << m->get_source() << endl;
int from = m->get_source().num();
if (electing_me) {
void Elector::handle_victory(MMonElectionVictory *m)
{
- dout(5) << "victory from " << m->get_source() << endl;
+ dout(5) << "handle_victory from " << m->get_source() << endl;
int from = m->get_source().num();
if (from < whoami) {
reset_tick();
// call election?
- assert(monmap->num_mon != 2);
- if (monmap->num_mon >= 3)
+ if (monmap->num_mon > 1) {
+ assert(monmap->num_mon != 2);
call_election();
+ } else {
+ // we're standalone.
+ set<int> q;
+ q.insert(whoami);
+ win_election(q);
+ }
}
void Monitor::shutdown()
//mdsmon->election_starting();
}
+void Monitor::win_election(set<int>& active)
+{
+ state = STATE_LEADER;
+ leader = whoami;
+ quorum = active;
+ dout(10) << "win_election, quorum is " << quorum << endl;
+
+ // init
+ osdmon->election_finished();
+ //mdsmon->election_finished();
+}
+void Monitor::lose_election(int l)
+{
+ state = STATE_PEON;
+ leader = l;
+ dout(10) << "lose_election, leader is mon" << leader << endl;
+}
friend class MDSMonitor;
friend class ClientMonitor;
-
// initiate election
void call_election();
- // called by Elector when it's finished
- void win_election(set<int>& active) {
- leader = whoami;
- quorum = active;
- state = STATE_LEADER;
- }
- void lose_election(int l) {
- state = STATE_PEON;
- leader = l;
- }
+ // end election (called by Elector)
+ void win_election(set<int>& q);
+ void lose_election(int l);
+
public:
Monitor(int w, Messenger *m, MonMap *mm) :
leader(0),
osdmon(0), mdsmon(0), clientmon(0)
{
- // hack leader, until election works.
- if (whoami == 0)
- state = STATE_LEADER;
- else
- state = STATE_PEON;
}
// set up pending_inc
pending_inc.epoch = osdmap.get_epoch()+1;
-
- } else {
- // FIXME. when elections work!
- if (mon->is_leader()) {
- create_initial();
- issue_leases();
- }
}
}
void OSDMonitor::election_finished()
{
- dout(10) << "election_starting" << endl;
+ dout(10) << "election_finished" << endl;
state = STATE_INIT;
+ // map?
+ if (osdmap.get_epoch() == 0 &&
+ mon->is_leader()) {
+ create_initial();
+ }
+
+
+
if (mon->is_leader()) {
// leader.
if (mon->monmap->num_mon == 1) {
}
else if (mon->is_peon()) {
// peon. send info
- messenger->send_message(new MMonOSDMapInfo(osdmap.epoch, osdmap.mon_epoch),
- MSG_ADDR_MON(mon->leader), mon->monmap->get_inst(mon->leader));
+ //messenger->send_message(new MMonOSDMapInfo(osdmap.epoch, osdmap.mon_epoch),
+ //MSG_ADDR_MON(mon->leader), mon->monmap->get_inst(mon->leader));
}
}
derr(0) << "accepter.start unable to bind to " << rank.listen_addr << endl;
assert(rc >= 0);
+ // what port did we get?
socklen_t llen = sizeof(rank.listen_addr);
getsockname(listen_sd, (sockaddr*)&rank.listen_addr, &llen);
- int myport = rank.listen_addr.sin_port;
+ int myport = ntohs(rank.listen_addr.sin_port);
+ dout(10) << "accepter.start bound to port " << myport << endl;
// listen!
rc = ::listen(listen_sd, 1000);
assert(rc >= 0);
-
- //dout(10) << "accepter.start listening on " << myport << endl;
// my address is...
char host[100];
memcpy((char *) &my_addr.sin_addr.s_addr,
myhostname->h_addr_list[0],
myhostname->h_length);
- my_addr.sin_port = myport;
+ my_addr.sin_port = htons(myport);
rank.listen_addr = my_addr;
assert(rc>=0);
// connect!
- rc = ::connect(sd, (sockaddr*)&peer_inst.addr, sizeof(myAddr));
- if (rc < 0) return rc;
+ rc = ::connect(sd, (struct sockaddr*)&peer_inst.addr, sizeof(myAddr));
+ if (rc < 0) {
+ dout(10) << "connect error " << peer_inst
+ << ", " << errno << ": " << strerror(errno) << endl;
+ return rc;
+ }
- // identify peer
+ // identify peer ..... FIXME
entity_inst_t inst;
rc = tcp_read(sd, (char*)&inst, sizeof(inst));
if (inst.rank < 0)
if (!server) {
int rc = connect();
if (rc < 0) {
- derr(1) << "pipe(" << peer_inst << ' ' << this << ").writer error connecting" << endl;
+ derr(1) << "pipe(" << peer_inst << ' ' << this << ").writer error connecting, "
+ << errno << ": " << strerror(errno)
+ << endl;
done = true;
list<Message*> out;
fail(out);
if (write_message(m) < 0) {
// failed!
- derr(1) << "pipe(" << peer_inst << ' ' << this << ").writer error sending " << *m << " to " << m->get_dest() << endl;
+ derr(1) << "pipe(" << peer_inst << ' ' << this << ").writer error sending " << *m << " to " << m->get_dest()
+ << ", " << errno << ": " << strerror(errno)
+ << endl;
out.push_front(m);
fail(out);
done = true;
<< (unsigned)addr[1] << "."
<< (unsigned)addr[2] << "."
<< (unsigned)addr[3] << ":"
- << (int)a.sin_port;
+ << ntohs(a.sin_port);
return out;
}