void ReplicationCoordinatorImpl::_onVoteRequestComplete(long long originalTerm) { invariant(_voteRequester); invariant(!_electionWinnerDeclarer); LoseElectionGuardV1 lossGuard(this); if (_topCoord->getTerm() != originalTerm) { log() << "not becoming primary, we have been superceded already"; return; } const VoteRequester::VoteRequestResult endResult = _voteRequester->getResult(); if (endResult == VoteRequester::InsufficientVotes) { log() << "not becoming primary, we received insufficient votes"; return; } else if (endResult == VoteRequester::StaleTerm) { log() << "not becoming primary, we have been superceded already"; return; } else if (endResult != VoteRequester::SuccessfullyElected) { log() << "not becoming primary, we received an unexpected problem"; return; } log() << "election succeeded, assuming primary role in term " << _topCoord->getTerm(); // Prevent last committed optime from updating until we finish draining. _setFirstOpTimeOfMyTerm( OpTime(Timestamp(std::numeric_limits<int>::max(), 0), std::numeric_limits<int>::max())); _performPostMemberStateUpdateAction(kActionWinElection); _voteRequester.reset(nullptr); _replExecutor.signalEvent(_electionFinishedEvent); lossGuard.dismiss(); }
void ReplicationCoordinatorImpl::_onVoteRequestComplete(long long originalTerm) { invariant(_voteRequester); LoseElectionGuardV1 lossGuard(this); LockGuard lk(_topoMutex); if (_topCoord->getTerm() != originalTerm) { log() << "not becoming primary, we have been superceded already"; return; } const VoteRequester::Result endResult = _voteRequester->getResult(); switch (endResult) { case VoteRequester::Result::kInsufficientVotes: log() << "not becoming primary, we received insufficient votes"; return; case VoteRequester::Result::kStaleTerm: log() << "not becoming primary, we have been superceded already"; return; case VoteRequester::Result::kSuccessfullyElected: log() << "election succeeded, assuming primary role in term " << _topCoord->getTerm(); break; } { // Mark all nodes that responded to our vote request as up to avoid immediately // relinquishing primary. stdx::lock_guard<stdx::mutex> lk(_mutex); Date_t now = _replExecutor.now(); const unordered_set<HostAndPort> liveNodes = _voteRequester->getResponders(); for (auto& nodeInfo : _slaveInfo) { if (liveNodes.count(nodeInfo.hostAndPort)) { nodeInfo.down = false; nodeInfo.lastUpdate = now; } } } // Prevent last committed optime from updating until we finish draining. _setFirstOpTimeOfMyTerm( OpTime(Timestamp(std::numeric_limits<int>::max(), 0), std::numeric_limits<int>::max())); _performPostMemberStateUpdateAction(kActionWinElection); _voteRequester.reset(nullptr); _replExecutor.signalEvent(_electionFinishedEvent); lossGuard.dismiss(); }