diff options
Diffstat (limited to 'db/repl/rs_sync.cpp')
-rw-r--r-- | db/repl/rs_sync.cpp | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/db/repl/rs_sync.cpp b/db/repl/rs_sync.cpp index 95bbe2040a6..5fe3075c0f7 100644 --- a/db/repl/rs_sync.cpp +++ b/db/repl/rs_sync.cpp @@ -188,6 +188,16 @@ namespace mongo { */ bool ReplSetImpl::tryToGoLiveAsASecondary(OpTime& /*out*/ minvalid) { bool golive = false; + + { + lock lk( this ); + + if (_maintenanceMode > 0) { + // we're not actually going live + return true; + } + } + { readlock lk("local.replset.minvalid"); BSONObj mv; @@ -211,7 +221,7 @@ namespace mongo { BSONObj remoteOldestOp = r.findOne(rsoplog, Query()); OpTime ts = remoteOldestOp["ts"]._opTime(); DEV log() << "replSet remoteOldestOp: " << ts.toStringLong() << rsLog; - else log(3) << "replSet remoteOldestOp: " << ts.toStringLong() << rsLog; + else LOG(3) << "replSet remoteOldestOp: " << ts.toStringLong() << rsLog; DEV { log() << "replSet lastOpTimeWritten: " << lastOpTimeWritten.toStringLong() << rsLog; log() << "replSet our state: " << state().toString() << rsLog; @@ -251,7 +261,7 @@ namespace mongo { assert(r.conn() == 0); if( !r.connect(hn) ) { - log(2) << "replSet can't connect to " << hn << " to read operations" << rsLog; + LOG(2) << "replSet can't connect to " << hn << " to read operations" << rsLog; r.resetConnection(); return false; } @@ -407,7 +417,7 @@ namespace mongo { } - { + try { writelock lk(""); /* if we have become primary, we dont' want to apply things from elsewhere @@ -421,11 +431,16 @@ namespace mongo { syncApply(o); _logOpObjRS(o); // with repl sets we write the ops to our oplog too } + catch (DBException& e) { + sethbmsg(str::stream() << "syncTail: " << e.toString() << ", syncing: " << o); + sleepsecs(30); + return; + } } } r.tailCheck(); if( !r.haveCursor() ) { - log(1) << "replSet end syncTail pass with " << hn << rsLog; + LOG(1) << "replSet end syncTail pass with " << hn << rsLog; // TODO : reuse our connection to the primary. return; } @@ -475,9 +490,7 @@ namespace mongo { _syncThread(); } catch(DBException& e) { - sethbmsg(str::stream() << "syncThread: " << e.toString() << - ", try 'use local; db.oplog.rs.findOne({ts : {$gt : new Timestamp(" << - lastOpTimeWritten.getSecs() << "000," << lastOpTimeWritten.getInc() << ")}});' on the primary"); + sethbmsg(str::stream() << "syncThread: " << e.toString()); sleepsecs(10); } catch(...) { @@ -580,7 +593,7 @@ namespace mongo { // the target might end up with a new Member, but s.slave never // changes so we'll compare the names || target == slave->slave || target->fullName() == slave->slave->fullName()) { - log(1) << "replica set ghost target no good" << endl; + LOG(1) << "replica set ghost target no good" << endl; return; } @@ -593,8 +606,7 @@ namespace mongo { slave->reader.ghostQueryGTE(rsoplog, last); } - log(1) << "last: " << slave->last.toString() << " to " << last.toString() << rsLog; - + LOG(1) << "replSet last: " << slave->last.toString() << " to " << last.toString() << rsLog; if (slave->last > last) { return; } @@ -608,11 +620,11 @@ namespace mongo { BSONObj o = slave->reader.nextSafe(); slave->last = o["ts"]._opTime(); } - log(2) << "now last is " << slave->last.toString() << rsLog; + LOG(2) << "now last is " << slave->last.toString() << rsLog; } catch (DBException& e) { // we'll be back - log(2) << "replSet ghost sync error: " << e.what() << " for " + LOG(2) << "replSet ghost sync error: " << e.what() << " for " << slave->slave->fullName() << rsLog; slave->reader.resetConnection(); } |