// we're alone, take it easy
commit();
state = STATE_ACTIVE;
- mon->refresh_from_paxos();
finish_proposal();
finish_contexts(g_ceph_context, waiting_for_active);
finish_contexts(g_ceph_context, waiting_for_commit);
state = STATE_ACTIVE;
extend_lease();
- mon->refresh_from_paxos();
-
finish_proposal();
// wake people up
}
-void Paxos::finish_queued_proposal()
+void Paxos::finish_proposal()
{
assert(mon->is_leader());
- assert(!proposals.empty());
-
- dout(10) << __func__ << " finishing proposal" << dendl;
- C_Proposal *proposal = static_cast<C_Proposal*>(proposals.front());
- dout(10) << __func__ << " finish it (proposal = "
- << proposal << ")" << dendl;;
- assert(proposal != NULL);
+ // make sure we have the latest state loaded up
+ mon->refresh_from_paxos();
- if (!proposal->proposed) {
- dout(10) << __func__ << " we must have received a stay message and we're "
- << "trying to finish before time. "
- << "Instead, propose it (if we are active)!" << dendl;
- } else {
- dout(10) << __func__ << " proposal took "
- << (ceph_clock_now(NULL) - proposal->proposal_time)
- << " to finish" << dendl;
+ // finish off the last proposal
+ if (!proposals.empty()) {
+ assert(mon->is_leader());
- proposals.pop_front();
- proposal->complete(0);
+ C_Proposal *proposal = static_cast<C_Proposal*>(proposals.front());
+ if (!proposal->proposed) {
+ dout(10) << __func__ << " proposal " << proposal << ": we must have received a stay message and we're "
+ << "trying to finish before time. "
+ << "Instead, propose it (if we are active)!" << dendl;
+ } else {
+ dout(10) << __func__ << " proposal " << proposal << " took "
+ << (ceph_clock_now(NULL) - proposal->proposal_time)
+ << " to finish" << dendl;
+ proposals.pop_front();
+ proposal->complete(0);
+ }
}
-}
-
-void Paxos::finish_proposal()
-{
- /* There is a lot of debug still going around. We will get rid of it later
- * on, as soon as everything "just works (tm)"
- */
- assert(mon->is_leader());
- if (!proposals.empty())
- finish_queued_proposal();
dout(10) << __func__ << " state " << state
<< " proposals left " << proposals.size() << dendl;