summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDwight <dwight@10gen.com>2010-08-18 14:11:42 -0400
committerEliot Horowitz <eliot@10gen.com>2010-09-15 11:36:55 -0400
commit33517de687b40fba5086a2f6d967704086b49d37 (patch)
treef97806d052d90c7546e73ad7f01a9b514cf02636
parentd18284ddc7b8f9d8b6e35916e887b3b2dc9769b8 (diff)
downloadmongo-33517de687b40fba5086a2f6d967704086b49d37.tar.gz
rs slaveDelay 162?
-rw-r--r--db/repl/heartbeat.cpp2
-rw-r--r--db/repl/rs_sync.cpp40
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;
}