diff options
author | Geert Bosch <geert@mongodb.com> | 2015-05-12 15:38:32 -0500 |
---|---|---|
committer | Geert Bosch <geert@mongodb.com> | 2015-05-12 17:01:05 -0400 |
commit | 4486be04b169d967683ce705b6288c82cbd34947 (patch) | |
tree | 359b7b24b83a8588edc177983f67bc7cf0030851 /src/mongo/util/mmap.cpp | |
parent | b94f71a5dfa687aef2aa1af83e797683f9ad7476 (diff) | |
download | mongo-4486be04b169d967683ce705b6288c82cbd34947.tar.gz |
SERVER-18410: Move MMAPv1 specific libraries from util to db/storage/mmap_v1
Also removes some dependencies on MMAP_v1 specific files that are not
needed anymore, and moves the 'paths' library to db/storage.
Diffstat (limited to 'src/mongo/util/mmap.cpp')
-rw-r--r-- | src/mongo/util/mmap.cpp | 258 |
1 files changed, 0 insertions, 258 deletions
diff --git a/src/mongo/util/mmap.cpp b/src/mongo/util/mmap.cpp deleted file mode 100644 index 0f112e63c18..00000000000 --- a/src/mongo/util/mmap.cpp +++ /dev/null @@ -1,258 +0,0 @@ -// mmap.cpp - -/* Copyright 2009 10gen Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - * As a special exception, the copyright holders give permission to link the - * code of portions of this program with the OpenSSL library under certain - * conditions as described in each individual source file and distribute - * linked combinations including the program with the OpenSSL library. You - * must comply with the GNU Affero General Public License in all respects - * for all of the code used other than as permitted herein. If you modify - * file(s) with this exception, you may extend this exception to your - * version of the file(s), but you are not obligated to do so. If you do not - * wish to do so, delete this exception statement from your version. If you - * delete this exception statement from all source files in the program, - * then also delete it in the license file. - */ - -#define MONGO_LOG_DEFAULT_COMPONENT ::mongo::logger::LogComponent::kControl - -#include "mongo/platform/basic.h" - -#include "mongo/util/mmap.h" - -#include <boost/filesystem/operations.hpp> - -#include "mongo/base/owned_pointer_vector.h" -#include "mongo/util/concurrency/rwlock.h" -#include "mongo/util/log.h" -#include "mongo/util/map_util.h" -#include "mongo/util/mongoutils/str.h" -#include "mongo/util/processinfo.h" -#include "mongo/util/progress_meter.h" -#include "mongo/util/startup_test.h" - -namespace mongo { - - using std::endl; - using std::map; - using std::set; - using std::string; - using std::stringstream; - using std::vector; - - void minOSPageSizeBytesTest(size_t minOSPageSizeBytes) { - fassert( 16325, minOSPageSizeBytes > 0 ); - fassert( 16326, minOSPageSizeBytes < 1000000 ); - // check to see if the page size is a power of 2 - fassert( 16327, (minOSPageSizeBytes & (minOSPageSizeBytes - 1)) == 0); - } - -namespace { - set<MongoFile*> mmfiles; - map<string,MongoFile*> pathToFile; -} // namespace - - /* Create. Must not exist. - @param zero fill file with zeros when true - */ - void* MemoryMappedFile::create(const std::string& filename, unsigned long long len, bool zero) { - uassert( 13468, string("can't create file already exists ") + filename, ! boost::filesystem::exists(filename) ); - void *p = map(filename.c_str(), len); - if( p && zero ) { - size_t sz = (size_t) len; - verify( len == sz ); - memset(p, 0, sz); - } - return p; - } - - /*static*/ void MemoryMappedFile::updateLength( const char *filename, unsigned long long &length ) { - if ( !boost::filesystem::exists( filename ) ) - return; - // make sure we map full length if preexisting file. - boost::uintmax_t l = boost::filesystem::file_size( filename ); - length = l; - } - - void* MemoryMappedFile::map(const char *filename) { - unsigned long long l; - try { - l = boost::filesystem::file_size( filename ); - } - catch(boost::filesystem::filesystem_error& e) { - uasserted(15922, mongoutils::str::stream() << "couldn't get file length when opening mapping " << filename << ' ' << e.what() ); - } - return map( filename , l ); - } - void* MemoryMappedFile::mapWithOptions(const char *filename, int options) { - unsigned long long l; - try { - l = boost::filesystem::file_size( filename ); - } - catch(boost::filesystem::filesystem_error& e) { - uasserted(15923, mongoutils::str::stream() << "couldn't get file length when opening mapping " << filename << ' ' << e.what() ); - } - return map( filename , l, options ); - } - - /* --- MongoFile ------------------------------------------------- - this is the administrative stuff - */ - - RWLockRecursiveNongreedy LockMongoFilesShared::mmmutex("mmmutex",10*60*1000 /* 10 minutes */); - unsigned LockMongoFilesShared::era = 99; // note this rolls over - - set<MongoFile*>& MongoFile::getAllFiles() { return mmfiles; } - - /* subclass must call in destructor (or at close). - removes this from pathToFile and other maps - safe to call more than once, albeit might be wasted work - ideal to call close to the close, if the close is well before object destruction - */ - void MongoFile::destroyed() { - LockMongoFilesShared::assertExclusivelyLocked(); - mmfiles.erase(this); - pathToFile.erase( filename() ); - } - - /*static*/ - void MongoFile::closeAllFiles( stringstream &message ) { - static int closingAllFiles = 0; - if ( closingAllFiles ) { - message << "warning closingAllFiles=" << closingAllFiles << endl; - return; - } - ++closingAllFiles; - - LockMongoFilesExclusive lk; - - ProgressMeter pm(mmfiles.size(), 2, 1, "files", "File Closing Progress"); - set<MongoFile*> temp = mmfiles; - for ( set<MongoFile*>::iterator i = temp.begin(); i != temp.end(); i++ ) { - (*i)->close(); // close() now removes from mmfiles - pm.hit(); - } - message << "closeAllFiles() finished"; - --closingAllFiles; - } - - /*static*/ long long MongoFile::totalMappedLength() { - unsigned long long total = 0; - - LockMongoFilesShared lk; - - for ( set<MongoFile*>::iterator i = mmfiles.begin(); i != mmfiles.end(); i++ ) - total += (*i)->length(); - - return total; - } - - void nullFunc() { } - - // callback notifications - void (*MongoFile::notifyPreFlush)() = nullFunc; - void (*MongoFile::notifyPostFlush)() = nullFunc; - - /*static*/ int MongoFile::flushAll( bool sync ) { - if ( sync ) notifyPreFlush(); - int x = _flushAll(sync); - if ( sync ) notifyPostFlush(); - return x; - } - - /*static*/ int MongoFile::_flushAll( bool sync ) { - if ( ! sync ) { - int num = 0; - LockMongoFilesShared lk; - for ( set<MongoFile*>::iterator i = mmfiles.begin(); i != mmfiles.end(); i++ ) { - num++; - MongoFile * mmf = *i; - if ( ! mmf ) - continue; - - mmf->flush( sync ); - } - return num; - } - - // want to do it sync - - // get a thread-safe Flushable object for each file first in a single lock - // so that we can iterate and flush without doing any locking here - OwnedPointerVector<Flushable> thingsToFlushWrapper; - vector<Flushable*>& thingsToFlush = thingsToFlushWrapper.mutableVector(); - { - LockMongoFilesShared lk; - for ( set<MongoFile*>::iterator i = mmfiles.begin(); i != mmfiles.end(); i++ ) { - MongoFile* mmf = *i; - if ( !mmf ) - continue; - thingsToFlush.push_back( mmf->prepareFlush() ); - } - } - - for ( size_t i = 0; i < thingsToFlush.size(); i++ ) { - thingsToFlush[i]->flush(); - } - - return thingsToFlush.size(); - } - - void MongoFile::created() { - LockMongoFilesExclusive lk; - mmfiles.insert(this); - } - - void MongoFile::setFilename(const std::string& fn) { - LockMongoFilesExclusive lk; - verify( _filename.empty() ); - _filename = boost::filesystem::absolute(fn).generic_string(); - MongoFile *&ptf = pathToFile[_filename]; - massert(13617, "MongoFile : multiple opens of same filename", ptf == 0); - ptf = this; - } - - MongoFile* MongoFileFinder::findByPath(const std::string& path) const { - return mapFindWithDefault(pathToFile, - boost::filesystem::absolute(path).generic_string(), - static_cast<MongoFile*>(NULL)); - } - - - void printMemInfo( const char * where ) { - LogstreamBuilder out = log(); - out << "mem info: "; - if ( where ) - out << where << " "; - - ProcessInfo pi; - if ( ! pi.supported() ) { - out << " not supported"; - return; - } - - out << "vsize: " << pi.getVirtualMemorySize() - << " resident: " << pi.getResidentSize() - << " mapped: " << ( MemoryMappedFile::totalMappedLength() / ( 1024 * 1024 ) ); - } - - void dataSyncFailedHandler() { - log() << "error syncing data to disk, probably a disk error"; - log() << " shutting down immediately to avoid corruption"; - fassertFailed( 17346 ); - } - -} // namespace mongo |