delete mon_caps;
}
-void Monitor::recovered_machine(int id)
+void Monitor::recovered_leader(int id)
{
+ if (paxos_recovered.count(id))
+ return;
paxos_recovered.insert(id);
if (paxos_recovered.size() == paxos.size()) {
dout(10) << "all paxos instances recovered, going writeable" << dendl;
+ for (vector<Paxos*>::iterator p = paxos.begin(); p != paxos.end(); p++)
+ finish_contexts(g_ceph_context, (*p)->waiting_for_active);
+ for (vector<Paxos*>::iterator p = paxos.begin(); p != paxos.end(); p++)
+ finish_contexts(g_ceph_context, (*p)->waiting_for_commit);
+ for (vector<Paxos*>::iterator p = paxos.begin(); p != paxos.end(); p++)
+ finish_contexts(g_ceph_context, (*p)->waiting_for_readable);
for (vector<Paxos*>::iterator p = paxos.begin(); p != paxos.end(); p++)
finish_contexts(g_ceph_context, (*p)->waiting_for_writeable);
}
quorum.clear();
outside_quorum.clear();
+ paxos_recovered.clear();
+ global_version = 0;
+
for (vector<Paxos*>::iterator p = paxos.begin(); p != paxos.end(); p++)
(*p)->restart();
for (vector<PaxosService*>::iterator p = paxos_service.begin(); p != paxos_service.end(); p++)
<< " features are " << quorum_features
<< dendl;
- paxos_recovered.clear();
- global_version = 0;
-
clog.info() << "mon." << name << "@" << rank
<< " won leader election with quorum " << quorum << "\n";
quorum_features = 0;
dout(10) << "lose_election, epoch " << epoch << " leader is mon" << leader
<< " quorum is " << quorum << dendl;
-
+
for (vector<Paxos*>::iterator p = paxos.begin(); p != paxos.end(); p++)
(*p)->peon_init();
for (vector<PaxosService*>::iterator p = paxos_service.begin(); p != paxos_service.end(); p++)
extend_lease();
// wake people up
- finish_contexts(g_ceph_context, waiting_for_active);
- finish_contexts(g_ceph_context, waiting_for_readable);
- //finish_contexts(g_ceph_context, waiting_for_writeable);
-
- mon->recovered_machine(machine_id);
+ if (mon->is_all_paxos_recovered()) {
+ finish_contexts(g_ceph_context, waiting_for_active);
+ finish_contexts(g_ceph_context, waiting_for_readable);
+ finish_contexts(g_ceph_context, waiting_for_writeable);
+ } else {
+ mon->recovered_leader(machine_id);
+ }
}
}
} else {
commit();
state = STATE_ACTIVE;
- finish_contexts(g_ceph_context, waiting_for_active);
- finish_contexts(g_ceph_context, waiting_for_commit);
- finish_contexts(g_ceph_context, waiting_for_readable);
- //finish_contexts(g_ceph_context, waiting_for_writeable);
-
- mon->recovered_machine(machine_id);
+ if (mon->is_all_paxos_recovered()) {
+ finish_contexts(g_ceph_context, waiting_for_active);
+ finish_contexts(g_ceph_context, waiting_for_commit);
+ finish_contexts(g_ceph_context, waiting_for_readable);
+ finish_contexts(g_ceph_context, waiting_for_writeable);
+ } else {
+ mon->recovered_leader(machine_id);
+ }
return;
}
extend_lease();
// wake people up
- finish_contexts(g_ceph_context, waiting_for_active);
- finish_contexts(g_ceph_context, waiting_for_commit);
- finish_contexts(g_ceph_context, waiting_for_readable);
- //finish_contexts(g_ceph_context, waiting_for_writeable);
-
- mon->recovered_machine(machine_id);
+ if (mon->is_all_paxos_recovered()) {
+ finish_contexts(g_ceph_context, waiting_for_active);
+ finish_contexts(g_ceph_context, waiting_for_commit);
+ finish_contexts(g_ceph_context, waiting_for_readable);
+ finish_contexts(g_ceph_context, waiting_for_writeable);
+ } else {
+ mon->recovered_leader(machine_id);
}
+ }
accept->put();
}
commit->put();
- finish_contexts(g_ceph_context, waiting_for_commit);
+ if (mon->is_all_paxos_recovered())
+ finish_contexts(g_ceph_context, waiting_for_commit);
+ // otherwise, this'll go when they all recover.
}
void Paxos::extend_lease()
if (mon->get_quorum().size() == 1) {
state = STATE_ACTIVE;
- mon->recovered_machine(machine_id);
+ mon->recovered_leader(machine_id);
return;
}