void operator()(DBClientCursorBatchIterator &i) { const string to_dbname = nsToDatabase(to_collection); while (i.moreInCurrentBatch()) { if (n % 128 == 127) { time_t now = time(0); if (now - lastLog >= 60) { // report progress if (lastLog) { log() << "clone " << to_collection << ' ' << n << endl; } lastLog = now; } mayInterrupt(_mayBeInterrupted); } BSONObj js = i.nextSafe(); ++n; if (isindex) { verify(strstr(from_collection, "system.indexes")); storedForLater->push_back(fixindex(js, to_dbname).getOwned()); } else { try { Client::ReadContext ctx(to_collection); if (_isCapped) { NamespaceDetails *d = nsdetails(to_collection); verify(d->isCapped()); BSONObj pk = js["$_"].Obj(); BSONObjBuilder rowBuilder; BSONObjIterator it(js); while (it.moreWithEOO()) { BSONElement e = it.next(); if (e.eoo()) { break; } if (!mongoutils::str::equals(e.fieldName(), "$_")) { rowBuilder.append(e); } } BSONObj row = rowBuilder.obj(); d->insertObjectIntoCappedWithPK(pk, row, NamespaceDetails::NO_LOCKTREE); } else { insertObject(to_collection, js, 0, logForRepl); } } catch (UserException& e) { error() << "error: exception cloning object in " << from_collection << ' ' << e.what() << " obj:" << js.toString() << '\n'; throw; } RARELY if ( time( 0 ) - saveLast > 60 ) { log() << n << " objects cloned so far from collection " << from_collection << endl; saveLast = time( 0 ); } } } }
static void runCappedInsertFromOplogWithLock( const char* ns, BSONObj& pk, BSONObj& row ) { NamespaceDetails *nsd = nsdetails(ns); // overwrite set to true because we are running on a secondary const uint64_t flags = (NamespaceDetails::NO_UNIQUE_CHECKS | NamespaceDetails::NO_LOCKTREE); nsd->insertObjectIntoCappedWithPK(pk, row, flags); nsd->notifyOfWriteOp(); }