diff options
author | Nick Zolnierz <nicholas.zolnierz@mongodb.com> | 2017-04-20 20:33:09 -0400 |
---|---|---|
committer | Nick Zolnierz <nicholas.zolnierz@mongodb.com> | 2017-04-21 16:42:46 -0400 |
commit | 4293ece343526a2795bac13105ac9ead723e872c (patch) | |
tree | 73fd021cbbf1788e322c45f2720f1ec06cb70f80 | |
parent | 23899209cad60aaafe114f6aea6cb83025ff51bc (diff) | |
download | mongo-4293ece343526a2795bac13105ac9ead723e872c.tar.gz |
SERVER-28787 Invariant failure with QueryOption_AwaitData
-rw-r--r-- | jstests/core/tailable_skip_limit.js | 7 | ||||
-rw-r--r-- | src/mongo/db/query/lite_parsed_query.cpp | 15 | ||||
-rw-r--r-- | src/mongo/db/query/lite_parsed_query.h | 5 |
3 files changed, 13 insertions, 14 deletions
diff --git a/jstests/core/tailable_skip_limit.js b/jstests/core/tailable_skip_limit.js index 2f3dbd19aea..7ed0b8ae7c2 100644 --- a/jstests/core/tailable_skip_limit.js +++ b/jstests/core/tailable_skip_limit.js @@ -79,4 +79,11 @@ assert.eq(t.find().addOption(2).itcount(), 0); assert.writeOK(t.insert({a: 1})); assert.eq(t.find().addOption(2).itcount(), 1); + + // Tests that find with 'awaitData' option but without 'tailable' option results in an + // assertion. + assert.throws(function() { + var cursor = t.find().addOption(DBQuery.Option.awaitData); + cursor.next(); + }); })(); diff --git a/src/mongo/db/query/lite_parsed_query.cpp b/src/mongo/db/query/lite_parsed_query.cpp index a4f9696b7a0..7dfdd093f12 100644 --- a/src/mongo/db/query/lite_parsed_query.cpp +++ b/src/mongo/db/query/lite_parsed_query.cpp @@ -375,7 +375,7 @@ StatusWith<unique_ptr<LiteParsedQuery>> LiteParsedQuery::makeFromFindCommand(Nam pq->addMetaProjection(); - Status validateStatus = pq->validateFindCmd(); + Status validateStatus = pq->validate(); if (!validateStatus.isOK()) { return validateStatus; } @@ -662,6 +662,11 @@ Status LiteParsedQuery::validate() const { } } + // AwaitData is only valid with a tailable cursor. + if (_awaitData && !_tailable) { + return Status(ErrorCodes::BadValue, "Cannot set awaitData without tailable"); + } + return Status::OK(); } @@ -975,14 +980,6 @@ void LiteParsedQuery::addMetaProjection() { } } -Status LiteParsedQuery::validateFindCmd() { - if (isAwaitData() && !isTailable()) { - return Status(ErrorCodes::BadValue, "Cannot set awaitData without tailable"); - } - - return validate(); -} - boost::optional<long long> LiteParsedQuery::getEffectiveBatchSize() const { return _batchSize ? _batchSize : _ntoreturn; } diff --git a/src/mongo/db/query/lite_parsed_query.h b/src/mongo/db/query/lite_parsed_query.h index 0287ad159e6..57c1ccd0a04 100644 --- a/src/mongo/db/query/lite_parsed_query.h +++ b/src/mongo/db/query/lite_parsed_query.h @@ -331,11 +331,6 @@ private: */ void addMetaProjection(); - /** - * Returns OK if this is valid in the find command context. - */ - Status validateFindCmd(); - const NamespaceString _nss; BSONObj _filter; |