diff options
Diffstat (limited to 'src/mongo/db/repl/initial_syncer.cpp')
-rw-r--r-- | src/mongo/db/repl/initial_syncer.cpp | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/src/mongo/db/repl/initial_syncer.cpp b/src/mongo/db/repl/initial_syncer.cpp index 8349428c3fd..53f020541b0 100644 --- a/src/mongo/db/repl/initial_syncer.cpp +++ b/src/mongo/db/repl/initial_syncer.cpp @@ -365,30 +365,44 @@ BSONObj InitialSyncer::getInitialSyncProgress() const { return _getInitialSyncProgress_inlock(); } +void InitialSyncer::_appendInitialSyncProgressMinimal_inlock(BSONObjBuilder* bob) const { + _stats.append(bob); + if (!_initialSyncState) { + return; + } + bob->appendNumber("fetchedMissingDocs", _initialSyncState->fetchedMissingDocs); + bob->appendNumber("appliedOps", _initialSyncState->appliedOps); + if (!_initialSyncState->beginTimestamp.isNull()) { + bob->append("initialSyncOplogStart", _initialSyncState->beginTimestamp); + } + if (!_initialSyncState->stopTimestamp.isNull()) { + bob->append("initialSyncOplogEnd", _initialSyncState->stopTimestamp); + } +} + BSONObj InitialSyncer::_getInitialSyncProgress_inlock() const { - BSONObjBuilder bob; try { - _stats.append(&bob); + BSONObjBuilder bob; + _appendInitialSyncProgressMinimal_inlock(&bob); if (_initialSyncState) { - bob.appendNumber("fetchedMissingDocs", _initialSyncState->fetchedMissingDocs); - bob.appendNumber("appliedOps", _initialSyncState->appliedOps); - if (!_initialSyncState->beginTimestamp.isNull()) { - bob.append("initialSyncOplogStart", _initialSyncState->beginTimestamp); - } - if (!_initialSyncState->stopTimestamp.isNull()) { - bob.append("initialSyncOplogEnd", _initialSyncState->stopTimestamp); - } if (_initialSyncState->dbsCloner) { BSONObjBuilder dbsBuilder(bob.subobjStart("databases")); _initialSyncState->dbsCloner->getStats().append(&dbsBuilder); dbsBuilder.doneFast(); } } + // In 3.4, BSONObjBuilder::obj() does not check the validity of the document it returns so + // we check it explicitly here. + auto obj = bob.obj(); + uassert(ErrorCodes::InvalidBSON, + str::stream() << "Invalid BSONObj size: " << obj.objsize(), + obj.isValid()); + return obj; } catch (const DBException& e) { - bob.resetToEmpty(); - bob.append("error", e.toString()); log() << "Error creating initial sync progress object: " << e.toString(); } + BSONObjBuilder bob; + _appendInitialSyncProgressMinimal_inlock(&bob); return bob.obj(); } |