Skip to content

Commit 0ff6321

Browse files
committed
SERVER-6808 RecoveryJob shouldn't find MMF for each journal entry
1 parent a781bbc commit 0ff6321

File tree

2 files changed

+47
-31
lines changed

2 files changed

+47
-31
lines changed

src/mongo/db/dur_recover.cpp

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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 )

src/mongo/db/dur_recover.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,13 @@ namespace mongo {
2828

2929
static RecoveryJob & get() { return _instance; }
3030
private:
31-
void write(const ParsedJournalEntry& entry); // actually writes to the file
32-
void applyEntry(const ParsedJournalEntry& entry, bool apply, bool dump);
31+
void write(const ParsedJournalEntry& entry, MongoMMF* mmf); // actually writes to the file
32+
void applyEntry(const ParsedJournalEntry& entry, bool apply, bool dump, MongoMMF* mmf);
3333
void applyEntries(const vector<ParsedJournalEntry> &entries);
3434
bool processFileBuffer(const void *, unsigned len);
3535
bool processFile(boost::filesystem::path journalfile);
3636
void _close(); // doesn't lock
37+
MongoMMF* getMongoMMF(const ParsedJournalEntry& entry);
3738

3839
list<boost::shared_ptr<MongoMMF> > _mmfs;
3940

0 commit comments

Comments
 (0)