diff options
author | Dwight <dwight@10gen.com> | 2010-08-02 18:48:31 -0400 |
---|---|---|
committer | Dwight <dwight@10gen.com> | 2010-08-02 18:48:31 -0400 |
commit | 2daef961134202b866a580551e17c6985393656b (patch) | |
tree | dfc2418876f74683c3f9d8af2042f6d0613d2ddc | |
parent | 1fc830e7ba4cf8fd96192a9eb5a8c65134ce493a (diff) | |
parent | 37b38182b30086f44cfb75ddbcbc65aab1bcbf0f (diff) | |
download | mongo-2daef961134202b866a580551e17c6985393656b.tar.gz |
Merge branch 'master' of github.com:mongodb/mongo
-rw-r--r-- | db/clientcursor.cpp | 5 | ||||
-rw-r--r-- | db/clientcursor.h | 2 | ||||
-rw-r--r-- | db/oplog.h | 5 | ||||
-rw-r--r-- | db/query.cpp | 14 | ||||
-rw-r--r-- | db/queryoptimizer.cpp | 8 | ||||
-rw-r--r-- | db/queryoptimizer.h | 4 | ||||
-rw-r--r-- | db/update.cpp | 4 | ||||
-rw-r--r-- | jstests/replsets/sync1.js | 17 | ||||
-rw-r--r-- | s/config_migrate.cpp | 2 | ||||
-rw-r--r-- | util/goodies.h | 21 | ||||
-rw-r--r-- | util/log.cpp | 3 |
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 |