diff options
author | Greg Studer <greg@10gen.com> | 2012-04-20 12:21:31 -0400 |
---|---|---|
committer | Greg Studer <greg@10gen.com> | 2012-04-20 12:21:31 -0400 |
commit | e50b2e242875405f2b52d8757139961243b21b78 (patch) | |
tree | c2162dd5eee4c8b97bf1659d02c4d71574068b93 | |
parent | 6477fd1d758682aadd0ef9789e449b85cd8be241 (diff) | |
download | mongo-e50b2e242875405f2b52d8757139961243b21b78.tar.gz |
SERVER-4680 sendNextBatch logic isn't correct with nonzero batch size
-rw-r--r-- | s/cursors.cpp | 16 | ||||
-rw-r--r-- | s/strategy_shard.cpp | 4 |
2 files changed, 9 insertions, 11 deletions
diff --git a/s/cursors.cpp b/s/cursors.cpp index 12b3d5e7d2f..5957ffcb418 100644 --- a/s/cursors.cpp +++ b/s/cursors.cpp @@ -82,7 +82,10 @@ namespace mongo { BufBuilder b(32768); int num = 0; - bool sendMore = true; + + // Send more if ntoreturn is 0, or any value > 1 (one is assumed to be a single doc return, with no cursor) + bool sendMore = ntoreturn == 0 || ntoreturn > 1; + ntoreturn = abs( ntoreturn ); while ( _cursor->more() ) { BSONObj o = _cursor->next(); @@ -99,20 +102,15 @@ namespace mongo { break; } - if ( ntoreturn != 0 && ( -1 * num + _totalSent ) == ntoreturn ) { - // hard limit - total to send - sendMore = false; - break; - } - - if ( ntoreturn == 0 && _totalSent == 0 && num > 100 ) { + if ( ntoreturn == 0 && _totalSent == 0 && num >= 100 ) { // first batch should be max 100 unless batch size specified break; } } bool hasMore = sendMore && _cursor->more(); - LOG(6) << "\t hasMore:" << hasMore << " wouldSendMoreIfHad: " << sendMore << " id:" << getId() << " totalSent: " << _totalSent << endl; + LOG(5) << "\t hasMore: " << hasMore << " sendMore: " << sendMore << " cursorMore: " << _cursor->more() << " ntoreturn: " << ntoreturn + << " num: " << num << " wouldSendMoreIfHad: " << sendMore << " id:" << getId() << " totalSent: " << _totalSent << endl; replyToQuery( 0 , r.p() , r.m() , b.buf() , b.len() , num , _totalSent , hasMore ? getId() : 0 ); _totalSent += num; diff --git a/s/strategy_shard.cpp b/s/strategy_shard.cpp index c6b30e7965f..c96a7e1b202 100644 --- a/s/strategy_shard.cpp +++ b/s/strategy_shard.cpp @@ -91,10 +91,10 @@ namespace mongo { } ShardedClientCursorPtr cc (new ShardedClientCursor( q , cursor )); - if ( ! cc->sendNextBatch( r ) ) { + if ( ! cc->sendNextBatch( r, q.ntoreturn ) ) { return; } - LOG(6) << "storing cursor : " << cc->getId() << endl; + LOG(5) << "storing cursor : " << cc->getId() << endl; cursorCache.store( cc ); } |