summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/initial_syncer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/repl/initial_syncer.cpp')
-rw-r--r--src/mongo/db/repl/initial_syncer.cpp38
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();
}