summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/cursor_response.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/query/cursor_response.cpp')
-rw-r--r--src/mongo/db/query/cursor_response.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/mongo/db/query/cursor_response.cpp b/src/mongo/db/query/cursor_response.cpp
index 4828002e401..b246d6d2b5b 100644
--- a/src/mongo/db/query/cursor_response.cpp
+++ b/src/mongo/db/query/cursor_response.cpp
@@ -50,6 +50,7 @@ const char kBatchFieldInitial[] = "firstBatch";
const char kBatchDocSequenceField[] = "cursor.nextBatch";
const char kBatchDocSequenceFieldInitial[] = "cursor.firstBatch";
const char kInternalLatestOplogTimestampField[] = "$_internalLatestOplogTimestamp";
+const char kPostBatchResumeTokenField[] = "postBatchResumeToken";
} // namespace
@@ -76,6 +77,9 @@ void CursorResponseBuilder::done(CursorId cursorId, StringData cursorNamespace)
} else {
_batch.reset();
}
+ if (!_postBatchResumeToken.isEmpty()) {
+ _cursorObject->append(kPostBatchResumeTokenField, _postBatchResumeToken);
+ }
_cursorObject->append(kIdField, cursorId);
_cursorObject->append(kNsField, cursorNamespace);
_cursorObject.reset();
@@ -124,12 +128,14 @@ CursorResponse::CursorResponse(NamespaceString nss,
std::vector<BSONObj> batch,
boost::optional<long long> numReturnedSoFar,
boost::optional<Timestamp> latestOplogTimestamp,
+ boost::optional<BSONObj> postBatchResumeToken,
boost::optional<BSONObj> writeConcernError)
: _nss(std::move(nss)),
_cursorId(cursorId),
_batch(std::move(batch)),
_numReturnedSoFar(numReturnedSoFar),
_latestOplogTimestamp(latestOplogTimestamp),
+ _postBatchResumeToken(std::move(postBatchResumeToken)),
_writeConcernError(std::move(writeConcernError)) {}
std::vector<StatusWith<CursorResponse>> CursorResponse::parseFromBSONMany(
@@ -220,6 +226,14 @@ StatusWith<CursorResponse> CursorResponse::parseFromBSON(const BSONObj& cmdRespo
doc.shareOwnershipWith(cmdResponse);
}
+ auto postBatchResumeTokenElem = cursorObj[kPostBatchResumeTokenField];
+ if (postBatchResumeTokenElem && postBatchResumeTokenElem.type() != BSONType::Object) {
+ return {ErrorCodes::BadValue,
+ str::stream() << kPostBatchResumeTokenField
+ << " format is invalid; expected Object, but found: "
+ << postBatchResumeTokenElem.type()};
+ }
+
auto latestOplogTimestampElem = cmdResponse[kInternalLatestOplogTimestampField];
if (latestOplogTimestampElem && latestOplogTimestampElem.type() != BSONType::bsonTimestamp) {
return {
@@ -243,6 +257,8 @@ StatusWith<CursorResponse> CursorResponse::parseFromBSON(const BSONObj& cmdRespo
boost::none,
latestOplogTimestampElem ? latestOplogTimestampElem.timestamp()
: boost::optional<Timestamp>{},
+ postBatchResumeTokenElem ? postBatchResumeTokenElem.Obj().getOwned()
+ : boost::optional<BSONObj>{},
writeConcernError ? writeConcernError.Obj().getOwned() : boost::optional<BSONObj>{}}};
}
@@ -261,6 +277,11 @@ void CursorResponse::addToBSON(CursorResponse::ResponseType responseType,
}
batchBuilder.doneFast();
+ if (_postBatchResumeToken) {
+ invariant(!_postBatchResumeToken->isEmpty());
+ cursorBuilder.append(kPostBatchResumeTokenField, *_postBatchResumeToken);
+ }
+
cursorBuilder.doneFast();
if (_latestOplogTimestamp) {