@@ -214,34 +214,9 @@ namespace mongo {
214214 _mmfs.clear ();
215215 }
216216
217- void RecoveryJob::write (const ParsedJournalEntry& entry) {
217+ void RecoveryJob::write (const ParsedJournalEntry& entry, MongoMMF* mmf ) {
218218 // TODO(mathias): look into making some of these dasserts
219219 verify (entry.e );
220- verify (entry.dbName );
221- verify (strnlen (entry.dbName , MaxDatabaseNameLen) < MaxDatabaseNameLen);
222-
223- const string fn = fileName (entry.dbName , entry.e ->getFileNo ());
224- MongoFile* file;
225- {
226- MongoFileFinder finder; // must release lock before creating new MongoMMF
227- file = finder.findByPath (fn);
228- }
229-
230- MongoMMF* mmf;
231- if (file) {
232- verify (file->isMongoMMF ());
233- mmf = (MongoMMF*)file;
234- }
235- else {
236- if ( !_recovering ) {
237- log () << " journal error applying writes, file " << fn << " is not open" << endl;
238- verify (false );
239- }
240- boost::shared_ptr<MongoMMF> sp (new MongoMMF);
241- verify (sp->open (fn, false ));
242- _mmfs.push_back (sp);
243- mmf = sp.get ();
244- }
245220
246221 if ((entry.e ->ofs + entry.e ->len ) <= mmf->length ()) {
247222 verify (mmf->view_write ());
@@ -256,7 +231,7 @@ namespace mongo {
256231 }
257232 }
258233
259- void RecoveryJob::applyEntry (const ParsedJournalEntry& entry, bool apply, bool dump) {
234+ void RecoveryJob::applyEntry (const ParsedJournalEntry& entry, bool apply, bool dump, MongoMMF* mmf ) {
260235 if ( entry.e ) {
261236 if ( dump ) {
262237 stringstream ss;
@@ -270,7 +245,7 @@ namespace mongo {
270245 log () << ss.str () << endl;
271246 }
272247 if ( apply ) {
273- write (entry);
248+ write (entry, mmf );
274249 }
275250 }
276251 else if (entry.op ) {
@@ -287,14 +262,54 @@ namespace mongo {
287262 }
288263 }
289264
265+ MongoMMF* RecoveryJob::getMongoMMF (const ParsedJournalEntry& entry) {
266+ verify (entry.dbName );
267+ verify (strnlen (entry.dbName , MaxDatabaseNameLen) < MaxDatabaseNameLen);
268+
269+ const string fn = fileName (entry.dbName , entry.e ->getFileNo ());
270+ MongoFile* file;
271+ {
272+ MongoFileFinder finder; // must release lock before creating new MongoMMF
273+ file = finder.findByPath (fn);
274+ }
275+
276+ MongoMMF* mmf;
277+ if (file) {
278+ verify (file->isMongoMMF ());
279+ mmf = (MongoMMF*)file;
280+ }
281+ else {
282+ if ( !_recovering ) {
283+ log () << " journal error applying writes, file " << fn << " is not open" << endl;
284+ verify (false );
285+ }
286+ boost::shared_ptr<MongoMMF> sp (new MongoMMF);
287+ verify (sp->open (fn, false ));
288+ _mmfs.push_back (sp);
289+ mmf = sp.get ();
290+ }
291+
292+ return mmf;
293+ }
294+
290295 void RecoveryJob::applyEntries (const vector<ParsedJournalEntry> &entries) {
291296 bool apply = (cmdLine.durOptions & CmdLine::DurScanOnly) == 0 ;
292297 bool dump = cmdLine.durOptions & CmdLine::DurDumpJournal;
293298 if ( dump )
294299 log () << " BEGIN section" << endl;
295300
301+ const char * lastDbName = NULL ;
302+ int lastFileNo = 0 ;
303+ MongoMMF* mmf = NULL ;
296304 for ( vector<ParsedJournalEntry>::const_iterator i = entries.begin (); i != entries.end (); ++i ) {
297- applyEntry (*i, apply, dump);
305+ if (i->e && (i->dbName != lastDbName || i->e ->getFileNo () != lastFileNo)) {
306+ mmf = getMongoMMF (*i);
307+ lastDbName = i->dbName ;
308+ lastFileNo = i->e ->getFileNo ();
309+ }
310+ fassert (16429 , !i->e || mmf);
311+
312+ applyEntry (*i, apply, dump, mmf);
298313 }
299314
300315 if ( dump )
0 commit comments