summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristina Chodorow <kristina@10gen.com>2010-10-27 17:21:21 -0400
committerEliot Horowitz <eliot@10gen.com>2010-11-20 00:34:19 -0500
commit269c53e84b5e37597b013edadb93ba028ddb3ee3 (patch)
tree250ff5f684322abbea30b66a5b2107dfd1d5ecbd
parente1570627aac10200317b211542546ca8ac2ab28b (diff)
downloadmongo-269c53e84b5e37597b013edadb93ba028ddb3ee3.tar.gz
check for better primary before voting yea SERVER-1987
-rw-r--r--db/repl/consensus.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/db/repl/consensus.cpp b/db/repl/consensus.cpp
index 04ed6433df0..1519c26d306 100644
--- a/db/repl/consensus.cpp
+++ b/db/repl/consensus.cpp
@@ -134,6 +134,9 @@ namespace mongo {
OID round = cmd["round"].OID();
int myver = rs.config().version;
+ const Member* primary = rs.box.getPrimary();
+ const Member* hopeful = rs.findById(whoid);
+
int vote = 0;
if( set != rs.name() ) {
log() << "replSet error received an elect request for '" << set << "' but our set name is '" << rs.name() << "'" << rsLog;
@@ -147,6 +150,16 @@ namespace mongo {
log() << "replSet info got stale version # during election" << rsLog;
vote = -10000;
}
+ else if( !hopeful ) {
+ log() << "couldn't find member with id " << whoid << rsLog;
+ vote = -10000;
+ }
+ else if( primary && primary->hbinfo().opTime > hopeful->hbinfo().opTime ) {
+ // other members might be aware of more up-to-date nodes
+ log() << hopeful->fullName() << " is trying to elect itself but " <<
+ primary->fullName() << " is already primary and more up-to-date" << rsLog;
+ vote = -10000;
+ }
else {
try {
vote = yea(whoid);