std::unique_ptr<Fetcher> AbstractOplogFetcher::_makeFetcher(const BSONObj& findCommandObj, const BSONObj& metadataObj) { return stdx::make_unique<Fetcher>( _getExecutor(), _source, _nss.db().toString(), findCommandObj, [this](const StatusWith<Fetcher::QueryResponse>& resp, Fetcher::NextAction*, BSONObjBuilder* builder) { return _callback(resp, builder); }, metadataObj, _getFindMaxTime() + kNetworkTimeoutBufferMS, _getGetMoreMaxTime() + kNetworkTimeoutBufferMS); }
BSONObj OplogFetcher::_makeFindCommandObject(const NamespaceString& nss, OpTime lastOpTimeFetched) const { auto lastCommittedWithCurrentTerm = _dataReplicatorExternalState->getCurrentTermAndLastCommittedOpTime(); auto term = lastCommittedWithCurrentTerm.value; BSONObjBuilder cmdBob; cmdBob.append("find", nss.coll()); cmdBob.append("filter", BSON("ts" << BSON("$gte" << lastOpTimeFetched.getTimestamp()))); cmdBob.append("tailable", true); cmdBob.append("oplogReplay", true); cmdBob.append("awaitData", true); cmdBob.append("maxTimeMS", durationCount<Milliseconds>(_getFindMaxTime())); cmdBob.append("batchSize", _batchSize); if (term != OpTime::kUninitializedTerm) { cmdBob.append("term", term); } // This ensures that the sync source never returns an empty batch of documents for the first set // of results. cmdBob.append("readConcern", BSON("afterClusterTime" << lastOpTimeFetched.getTimestamp())); return cmdBob.obj(); }