diff options
author | Dwight <dwight@10gen.com> | 2010-08-18 14:11:42 -0400 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2010-09-15 11:36:55 -0400 |
commit | 33517de687b40fba5086a2f6d967704086b49d37 (patch) | |
tree | f97806d052d90c7546e73ad7f01a9b514cf02636 | |
parent | d18284ddc7b8f9d8b6e35916e887b3b2dc9769b8 (diff) | |
download | mongo-33517de687b40fba5086a2f6d967704086b49d37.tar.gz |
rs slaveDelay 162?
-rw-r--r-- | db/repl/heartbeat.cpp | 2 | ||||
-rw-r--r-- | db/repl/rs_sync.cpp | 40 |
2 files changed, 38 insertions, 4 deletions
diff --git a/db/repl/heartbeat.cpp b/db/repl/heartbeat.cpp index 62658180a1d..39bd82ae8f3 100644 --- a/db/repl/heartbeat.cpp +++ b/db/repl/heartbeat.cpp @@ -98,7 +98,7 @@ namespace mongo { result.append("set", theReplSet->name()); result.append("state", theReplSet->state().s); result.append("hbmsg", theReplSet->hbmsg()); - result.append("time", (int) time(0)); + result.append("time", (long long) time(0)); result.appendDate("opTime", theReplSet->lastOpTimeWritten.asDate()); int v = theReplSet->config().version; result.append("v", v); diff --git a/db/repl/rs_sync.cpp b/db/repl/rs_sync.cpp index eaa79d67bec..d72350841a0 100644 --- a/db/repl/rs_sync.cpp +++ b/db/repl/rs_sync.cpp @@ -1,4 +1,4 @@ -/** +p/** * Copyright (C) 2008 10gen Inc. * * This program is free software: you can redistribute it and/or modify @@ -131,6 +131,7 @@ namespace mongo { return true; } + /* tail the primary's oplog. ok to return, will be re-called. */ void ReplSetImpl::syncTail() { // todo : locking vis a vis the mgr... @@ -213,7 +214,8 @@ namespace mongo { } } - while( 1 ) { + bool achievedMinValid = false; + while( 1 ) { while( 1 ) { if( !r.moreInCurrentBatch() ) { /* we need to occasionally check some things. between @@ -237,6 +239,7 @@ namespace mongo { golive = true; /* must have been the original member */ } if( golive ) { + achievedMinValid = true; sethbmsg(""); //log() << "replSet SECONDARY" << rsLog; changeState(MemberState::RS_SECONDARY); @@ -247,6 +250,9 @@ namespace mongo { /* todo: too stale capability */ } + else { + achievedMinValid = true; + } if( box.getPrimary() != primary ) return; @@ -270,11 +276,39 @@ namespace mongo { syncApply(o); _logOpObjRS(o); /* with repl sets we write the ops to our oplog too: */ } + unsigned sd = myConfig().slaveDelay; + if( sd ) { + const OpTime ts = o["ts"]._opTime(); + long long a = ts.getSecs(); + long long b = time(0); + long long lag = b - a; + long long sleeptime = sd - lag; + if( sleeptime > 0 ) { + uassert(12000, "rs slaveDelay differential too big check clocks and systems", sleeptime < 0x40000000); + log() << "replSet temp slavedelay sleep:" << sleeptime << rsLog; + if( sleeptime < 120 ) { + sleepsecs((int) sleeptime); + } + else { + // sleep(hours) would prevent reconfigs from taking effect & such! + long long waitUntil = b + sleeptime; + while( 1 ) { + sleepsecs(10); + if( time(0) >= waitUntil ) + break; + if( box.getPrimary() != primary ) + break; + if( myConfig().slaveDelay != sd ) // reconf + break; + } + } + } + } } } r.tailCheck(); if( !r.haveCursor() ) { - log() << "replSet TEMP end syncTail pass with " << hn << rsLog; + log(1) << "replSet end syncTail pass with " << hn << rsLog; // TODO : reuse our connection to the primary. return; } |