summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Zolnierz <nicholas.zolnierz@mongodb.com>2017-04-20 20:33:09 -0400
committerNick Zolnierz <nicholas.zolnierz@mongodb.com>2017-04-21 16:42:46 -0400
commit4293ece343526a2795bac13105ac9ead723e872c (patch)
tree73fd021cbbf1788e322c45f2720f1ec06cb70f80
parent23899209cad60aaafe114f6aea6cb83025ff51bc (diff)
downloadmongo-4293ece343526a2795bac13105ac9ead723e872c.tar.gz
SERVER-28787 Invariant failure with QueryOption_AwaitData
-rw-r--r--jstests/core/tailable_skip_limit.js7
-rw-r--r--src/mongo/db/query/lite_parsed_query.cpp15
-rw-r--r--src/mongo/db/query/lite_parsed_query.h5
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;