diff options
Diffstat (limited to 'src/mongo/db/query/cursor_response.cpp')
| -rw-r--r-- | src/mongo/db/query/cursor_response.cpp | 21 |
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) { |
