From 815a170af4f9579e7f9130dae6265ad274805e39 Mon Sep 17 00:00:00 2001 From: matt dannenberg Date: Thu, 3 Sep 2015 04:57:40 -0400 Subject: SERVER-19836 implement priority logic for PV1 elections --- src/mongo/db/repl/replica_set_config.cpp | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'src/mongo/db/repl/replica_set_config.cpp') diff --git a/src/mongo/db/repl/replica_set_config.cpp b/src/mongo/db/repl/replica_set_config.cpp index ff881dce42b..f5f7c495ef2 100644 --- a/src/mongo/db/repl/replica_set_config.cpp +++ b/src/mongo/db/repl/replica_set_config.cpp @@ -649,5 +649,39 @@ std::vector ReplicaSetConfig::getWriteConcernNames() const { return names; } +Milliseconds ReplicaSetConfig::getPriorityTakeoverDelay(int memberIdx) const { + auto member = getMemberAt(memberIdx); + int priorityRank = _calculatePriorityRank(member.getPriority()); + Milliseconds nodeSpecificDelay = + getVoterPosition(memberIdx) * getElectionTimeoutPeriod() / getTotalVotingMembers(); + return (priorityRank + 1) * getElectionTimeoutPeriod() + nodeSpecificDelay; +} + +int ReplicaSetConfig::_calculatePriorityRank(int priority) const { + int count = 0; + for (MemberIterator mem = membersBegin(); mem != membersEnd(); mem++) { + if (mem->getPriority() > priority) { + count++; + } + } + return count; +} + +int ReplicaSetConfig::getVoterPosition(int memberIdx) const { + int pos = 0; + int idx = 0; + for (auto mem = membersBegin(); mem != membersEnd(); ++mem) { + if (idx == memberIdx) { + break; + } + + if (mem->isVoter()) { + pos++; + } + idx++; + } + return pos; +} + } // namespace repl } // namespace mongo -- cgit v1.2.1