/** indicate that a database is about to be dropped. call before the actual drop. */ void DurableImpl::droppingDb(string db) { shared_ptr<DurOp> op( new DropDbOp(db) ); commitJob.noteOp(op); // must commit now, before files are actually unlinked: groupCommit(); }
static void go() { if( !commitJob.hasWritten() ) return; { readlocktry lk("", 1000); if( lk.got() ) { groupCommit(); return; } } // starvation on read locks could occur. so if read lock acquisition is slow, try to get a // write lock instead. otherwise writes could use too much RAM. writelock lk; groupCommit(); }
/** called when a MongoMMF is closing -- we need to go ahead and group commit in that case before its views disappear */ void closingFileNotification() { if( dbMutex.atLeastReadLocked() ) { groupCommit(); } else { assert( inShutdown() ); if( commitJob.hasWritten() ) { log() << "dur warning files are closing outside locks with writes pending" << endl; } } }
static void durThread() { Client::initThread("journal"); bool samePartition = true; try { const std::string dbpathDir = boost::filesystem::path(storageGlobalParams.dbpath).string(); samePartition = onSamePartition(getJournalDir().string(), dbpathDir); } catch(...) { } while (shutdownRequested.loadRelaxed() == 0) { unsigned ms = storageGlobalParams.journalCommitInterval; if( ms == 0 ) { ms = samePartition ? 100 : 30; } unsigned oneThird = (ms / 3) + 1; // +1 so never zero try { stats.rotate(); boost::mutex::scoped_lock lock(flushMutex); // commit sooner if one or more getLastError j:true is pending for (unsigned i = 0; i <= 2; i++) { if (flushRequested.timed_wait(lock, Milliseconds(oneThird))) { // Someone forced a flush break; } if (commitJob._notify.nWaiting()) break; if (commitJob.bytes() > UncommittedBytesLimit / 2) break; } OperationContextImpl txn; // Waits for all active operations to drain and won't let new ones start. This // should be optimized to allow readers in (see SERVER-15262). AutoAcquireFlushLockForMMAPV1Commit flushLock(txn.lockState()); groupCommit(); remapPrivateView(); } catch(std::exception& e) { log() << "exception in durThread causing immediate shutdown: " << e.what() << endl; mongoAbort("exception in durThread"); } catch (...) { log() << "unhandled exception in durThread causing immediate shutdown" << endl; mongoAbort("unhandled exception in durThread"); } } cc().shutdown(); }