summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDwight <dwight@10gen.com>2010-08-02 18:48:31 -0400
committerDwight <dwight@10gen.com>2010-08-02 18:48:31 -0400
commit2daef961134202b866a580551e17c6985393656b (patch)
treedfc2418876f74683c3f9d8af2042f6d0613d2ddc
parent1fc830e7ba4cf8fd96192a9eb5a8c65134ce493a (diff)
parent37b38182b30086f44cfb75ddbcbc65aab1bcbf0f (diff)
downloadmongo-2daef961134202b866a580551e17c6985393656b.tar.gz
Merge branch 'master' of github.com:mongodb/mongo
-rw-r--r--db/clientcursor.cpp5
-rw-r--r--db/clientcursor.h2
-rw-r--r--db/oplog.h5
-rw-r--r--db/query.cpp14
-rw-r--r--db/queryoptimizer.cpp8
-rw-r--r--db/queryoptimizer.h4
-rw-r--r--db/update.cpp4
-rw-r--r--jstests/replsets/sync1.js17
-rw-r--r--s/config_migrate.cpp2
-rw-r--r--util/goodies.h21
-rw-r--r--util/log.cpp3
11 files changed, 47 insertions, 38 deletions
diff --git a/db/clientcursor.cpp b/db/clientcursor.cpp
index c15bbcb61df..ad7f9cecc8b 100644
--- a/db/clientcursor.cpp
+++ b/db/clientcursor.cpp
@@ -236,9 +236,9 @@ namespace mongo {
}
}
- void ClientCursor::prepareToYield( YieldData &data ) {
+ bool ClientCursor::prepareToYield( YieldData &data ) {
if ( ! c->supportYields() )
- return;
+ return false;
// need to store in case 'this' gets deleted
data._id = cursorid;
@@ -268,6 +268,7 @@ namespace mongo {
}
}
}
+ return true;
}
bool ClientCursor::recoverFromYield( const YieldData &data ) {
diff --git a/db/clientcursor.h b/db/clientcursor.h
index ed9354ec373..32453fdc17f 100644
--- a/db/clientcursor.h
+++ b/db/clientcursor.h
@@ -195,7 +195,7 @@ namespace mongo {
static void staticYield( int micros );
struct YieldData { CursorId _id; bool _doingDeletes; };
- void prepareToYield( YieldData &data );
+ bool prepareToYield( YieldData &data );
static bool recoverFromYield( const YieldData &data );
struct YieldLock : boost::noncopyable {
diff --git a/db/oplog.h b/db/oplog.h
index b596d4f23b7..d1e49900dc9 100644
--- a/db/oplog.h
+++ b/db/oplog.h
@@ -130,10 +130,11 @@ namespace mongo {
}
}
}
- void prepareToYield() {
+ bool prepareToYield() {
if ( _findingStartCursor ) {
- _findingStartCursor->prepareToYield( _yieldData );
+ return _findingStartCursor->prepareToYield( _yieldData );
}
+ return true;
}
void recoverFromYield() {
if ( _findingStartCursor ) {
diff --git a/db/query.cpp b/db/query.cpp
index 814c77663cc..847888ffe12 100644
--- a/db/query.cpp
+++ b/db/query.cpp
@@ -62,11 +62,11 @@ namespace mongo {
virtual void _init() {
c_ = qp().newCursor();
}
- virtual void prepareToYield() {
+ virtual bool prepareToYield() {
if ( ! _cc ) {
_cc.reset( new ClientCursor( QueryOption_NoCursorTimeout , c_ , qp().ns() ) );
}
- _cc->prepareToYield( _yieldData );
+ return _cc->prepareToYield( _yieldData );
}
virtual void recoverFromYield() {
if ( !ClientCursor::recoverFromYield( _yieldData ) ) {
@@ -406,11 +406,11 @@ namespace mongo {
}
}
- virtual void prepareToYield() {
+ virtual bool prepareToYield() {
if ( ! _cc ) {
_cc.reset( new ClientCursor( QueryOption_NoCursorTimeout , c_ , _ns.c_str() ) );
}
- _cc->prepareToYield( _yieldData );
+ return _cc->prepareToYield( _yieldData );
}
virtual void recoverFromYield() {
@@ -630,14 +630,14 @@ namespace mongo {
}
}
- virtual void prepareToYield() {
+ virtual bool prepareToYield() {
if ( _findingStartCursor.get() ) {
- _findingStartCursor->prepareToYield();
+ return _findingStartCursor->prepareToYield();
} else {
if ( ! _cc ) {
_cc.reset( new ClientCursor( QueryOption_NoCursorTimeout , _c , _pq.ns() ) );
}
- _cc->prepareToYield( _yieldData );
+ return _cc->prepareToYield( _yieldData );
}
}
diff --git a/db/queryoptimizer.cpp b/db/queryoptimizer.cpp
index 24d98f35e76..0a6067bbc43 100644
--- a/db/queryoptimizer.cpp
+++ b/db/queryoptimizer.cpp
@@ -511,7 +511,9 @@ namespace mongo {
int micros = ClientCursor::yieldSuggest();
if ( micros > 0 ) {
for( vector< shared_ptr< QueryOp > >::const_iterator i = ops.begin(); i != ops.end(); ++i ) {
- prepareToYield( **i );
+ if ( !prepareToYield( **i ) ) {
+ return;
+ }
}
ClientCursor::staticYield( micros );
for( vector< shared_ptr< QueryOp > >::const_iterator i = ops.begin(); i != ops.end(); ++i ) {
@@ -615,8 +617,8 @@ namespace mongo {
GUARD_OP_EXCEPTION( op, if ( !op.error() ) { op.next(); } );
}
- void QueryPlanSet::Runner::prepareToYield( QueryOp &op ) {
- GUARD_OP_EXCEPTION( op, if ( !op.error() ) { op.prepareToYield(); } );
+ bool QueryPlanSet::Runner::prepareToYield( QueryOp &op ) {
+ GUARD_OP_EXCEPTION( op, if ( !op.error() ) { return op.prepareToYield(); } );
}
void QueryPlanSet::Runner::recoverFromYield( QueryOp &op ) {
diff --git a/db/queryoptimizer.h b/db/queryoptimizer.h
index b213cd9759c..8314bfa4182 100644
--- a/db/queryoptimizer.h
+++ b/db/queryoptimizer.h
@@ -111,7 +111,7 @@ namespace mongo {
virtual bool mayRecordPlan() const = 0;
- virtual void prepareToYield() { massert( 13335, "yield not supported", false ); }
+ virtual bool prepareToYield() { massert( 13335, "yield not supported", false ); return false; }
virtual void recoverFromYield() { massert( 13336, "yield not supported", false ); }
/** @return a copy of the inheriting class, which will be run with its own
@@ -211,7 +211,7 @@ namespace mongo {
QueryPlanSet &plans_;
static void initOp( QueryOp &op );
static void nextOp( QueryOp &op );
- static void prepareToYield( QueryOp &op );
+ static bool prepareToYield( QueryOp &op );
static void recoverFromYield( QueryOp &op );
};
const char *ns;
diff --git a/db/update.cpp b/db/update.cpp
index ed28ad2ba45..fa4de7d0078 100644
--- a/db/update.cpp
+++ b/db/update.cpp
@@ -735,11 +735,11 @@ namespace mongo {
setComplete();
}
}
- virtual void prepareToYield() {
+ virtual bool prepareToYield() {
if ( ! _cc ) {
_cc.reset( new ClientCursor( QueryOption_NoCursorTimeout , _c , qp().ns() ) );
}
- _cc->prepareToYield( _yieldData );
+ return _cc->prepareToYield( _yieldData );
}
virtual void recoverFromYield() {
if ( !ClientCursor::recoverFromYield( _yieldData ) ) {
diff --git a/jstests/replsets/sync1.js b/jstests/replsets/sync1.js
index 4d88256b132..2d04141aea6 100644
--- a/jstests/replsets/sync1.js
+++ b/jstests/replsets/sync1.js
@@ -56,14 +56,23 @@ doTest = function (signal) {
dbs[0].bar.insert({ x: "foo" + i, y: "bar" + i, z: i, w: "biz baz bar boo" });
}
+ var status;
+ do {
+ sleep(1000);
+ status = dbs[0].getSisterDB("admin").runCommand({replSetGetStatus : 1});
+ } while(status.members[1].state != 2 && status.members[2].state != 2);
+
print("\nsync1.js ********************************************************************** part 6");
dbs[0].getSisterDB("admin").runCommand({ replSetTest: 1, blind: true });
print("\nsync1.js ********************************************************************** part 7");
+ sleep(5000);
+
// yay! there are out-of-date nodes
var max1;
var max2;
+ var count = 0;
while( 1 ) {
try {
max1 = dbs[1].bar.find().sort({ z: -1 }).limit(1).next();
@@ -72,6 +81,10 @@ doTest = function (signal) {
catch(e) {
print("\nsync1.js couldn't get max1/max2; retrying " + e);
sleep(2000);
+ count++;
+ if (count == 50) {
+ assert(false, "errored out 50 times");
+ }
continue;
}
break;
@@ -79,7 +92,7 @@ doTest = function (signal) {
print("\nsync1.js ********************************************************************** part 8");
- if (max1.z == inserts && max2.z == inserts) {
+ if (max1.z == (inserts-1) && max2.z == (inserts-1)) {
print("\nsync1.js try increasing # if inserts and running again");
replTest.stopSet(signal);
return;
@@ -97,7 +110,7 @@ doTest = function (signal) {
assert(newMaster + "" != master + "", "new master is " + newMaster + ", old master was " + master);
print("\nsync1.js new master is " + newMaster + ", old master was " + master);
- var count = 0;
+ count = 0;
do {
try {
max1 = dbs[1].bar.find().sort({ z: -1 }).limit(1).next();
diff --git a/s/config_migrate.cpp b/s/config_migrate.cpp
index c8c674d1d64..1a4214416f2 100644
--- a/s/config_migrate.cpp
+++ b/s/config_migrate.cpp
@@ -61,7 +61,7 @@ namespace mongo {
string backupName;
{
stringstream ss;
- ss << "config-backup-" << terseCurrentTime();
+ ss << "config-backup-" << terseCurrentTime(false);
backupName = ss.str();
}
log() << "backing up config to: " << backupName << endl;
diff --git a/util/goodies.h b/util/goodies.h
index 0e0611a25ca..d33e0b9b5a5 100644
--- a/util/goodies.h
+++ b/util/goodies.h
@@ -161,23 +161,16 @@ namespace mongo {
#endif
}
- inline void terseCurrentTime( stringstream& ss , bool seconds = false ){
+ // uses ISO 8601 dates without trailing Z
+ // colonsOk should be false when creating filenames
+ inline string terseCurrentTime(bool colonsOk=true){
struct tm t;
time_t_to_Struct( time(0) , &t );
- ss
- << ( 1900 + t.tm_year ) << "-" << ( 1 + t.tm_mon ) << "-" << t.tm_mday
- << "_"
- << t.tm_hour << "-" << t.tm_min;
-
- if ( seconds )
- ss << "-" << t.tm_sec;
- }
-
- inline string terseCurrentTime(){
- stringstream ss;
- terseCurrentTime(ss);
- return ss.str();
+ const char* fmt = (colonsOk ? "%Y-%m-%dT%H:%M:%S" : "%Y-%m-%dT%H-%M-%S");
+ char buf[32];
+ assert(strftime(buf, sizeof(buf), fmt, &t) == 19);
+ return buf;
}
#define MONGO_asctime _asctime_not_threadsafe_
diff --git a/util/log.cpp b/util/log.cpp
index c8d49b2a3b5..bfd9154b456 100644
--- a/util/log.cpp
+++ b/util/log.cpp
@@ -76,8 +76,7 @@ namespace mongo {
localtime_r( &_opened , &t );
stringstream ss;
- ss << _path << ".";
- terseCurrentTime( ss , true );
+ ss << _path << "." << terseCurrentTime(false);
string s = ss.str();
rename( _path.c_str() , s.c_str() );
#endif