diff options
author | David Storch <david.storch@10gen.com> | 2014-12-11 18:06:06 -0500 |
---|---|---|
committer | David Storch <david.storch@10gen.com> | 2014-12-12 17:16:52 -0500 |
commit | 2a148f717998b77199c3dd3d7d4e4e47eb1141ef (patch) | |
tree | 91b362ec333100c7d475c207950150efdd7091e7 /src/mongo | |
parent | 8fc0c842c03288c55a93db46241c5467ea17416e (diff) | |
download | mongo-2a148f717998b77199c3dd3d7d4e4e47eb1141ef.tar.gz |
SERVER-16515 change RecordAccessTracker to be per-MMAPv1 engine, not per-MMAPv1 database
Diffstat (limited to 'src/mongo')
4 files changed, 36 insertions, 6 deletions
diff --git a/src/mongo/db/storage/mmap_v1/mmap_v1_engine.cpp b/src/mongo/db/storage/mmap_v1/mmap_v1_engine.cpp index 01da36dec59..5430b473c17 100644 --- a/src/mongo/db/storage/mmap_v1/mmap_v1_engine.cpp +++ b/src/mongo/db/storage/mmap_v1/mmap_v1_engine.cpp @@ -403,6 +403,10 @@ namespace { return getDur().isDurable(); } + RecordAccessTracker& MMAPV1Engine::getRecordAccessTracker() { + return _recordAccessTracker; + } + void MMAPV1Engine::cleanShutdown() { // wait until file preallocation finishes // we would only hang here if the file_allocator code generates a diff --git a/src/mongo/db/storage/mmap_v1/mmap_v1_engine.h b/src/mongo/db/storage/mmap_v1/mmap_v1_engine.h index 3c8ae08bcbd..9f1b42c234f 100644 --- a/src/mongo/db/storage/mmap_v1/mmap_v1_engine.h +++ b/src/mongo/db/storage/mmap_v1/mmap_v1_engine.h @@ -35,6 +35,7 @@ #include <boost/thread/mutex.hpp> #include "mongo/db/storage/storage_engine.h" +#include "mongo/db/storage/mmap_v1/record_access_tracker.h" namespace mongo { @@ -71,10 +72,22 @@ namespace mongo { } // MMAPv1 specific (non-virtual) - Status repairDatabase( OperationContext* tnx, + Status repairDatabase( OperationContext* txn, const std::string& dbName, bool preserveClonedFilesOnFailure, bool backupOriginalFiles ); + + /** + * Gets a reference to the abstraction used by MMAP v1 to track recently used memory + * addresses. + * + * MMAPv1 specific (non-virtual). This is non-const because callers are allowed to use + * the returned reference to modify the RecordAccessTracker. + * + * The RecordAccessTracker is thread-safe (it uses its own mutex internally). + */ + RecordAccessTracker& getRecordAccessTracker(); + private: static void _listDatabases( const std::string& directory, std::vector<std::string>* out ); @@ -82,6 +95,11 @@ namespace mongo { boost::mutex _entryMapMutex; typedef std::map<std::string,MMAPV1DatabaseCatalogEntry*> EntryMap; EntryMap _entryMap; + + // A record access tracker is essentially a large table which tracks recently used + // addresses. It is used when higher layers (e.g. the query system) need to ask + // the storage engine whether data is likely in physical memory. + RecordAccessTracker _recordAccessTracker; }; void _deleteDataFiles(const std::string& database); diff --git a/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp b/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp index a579723a964..e958cf9182d 100644 --- a/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp +++ b/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp @@ -37,11 +37,13 @@ #include "mongo/base/counter.h" #include "mongo/db/audit.h" #include "mongo/db/client.h" +#include "mongo/db/global_environment_experiment.h" #include "mongo/db/storage/mmap_v1/dur.h" #include "mongo/db/storage/mmap_v1/data_file.h" #include "mongo/db/storage/mmap_v1/record.h" #include "mongo/db/storage/mmap_v1/extent.h" #include "mongo/db/storage/mmap_v1/extent_manager.h" +#include "mongo/db/storage/mmap_v1/mmap_v1_engine.h" #include "mongo/db/storage/mmap_v1/mmap_v1_options.h" #include "mongo/db/storage/record_fetcher.h" #include "mongo/db/operation_context.h" @@ -106,7 +108,10 @@ namespace mongo { _path(path.toString()), _directoryPerDB(directoryPerDB), _rid(RESOURCE_METADATA, dbname) { - + StorageEngine* engine = getGlobalEnvironment()->getGlobalStorageEngine(); + invariant(engine->isMmapV1()); + MMAPV1Engine* mmapEngine = static_cast<MMAPV1Engine*>(engine); + _recordAccessTracker = &mmapEngine->getRecordAccessTracker(); } boost::filesystem::path MmapV1ExtentManager::fileName( int n ) const { @@ -261,7 +266,7 @@ namespace mongo { Record* MmapV1ExtentManager::recordForV1( const DiskLoc& loc ) const { Record* record = _recordForV1( loc ); - _recordAccessTracker.markAccessed( record ); + _recordAccessTracker->markAccessed( record ); return record; } @@ -277,7 +282,7 @@ namespace mongo { } } - if ( !_recordAccessTracker.checkAccessedAndMark( record ) ) { + if ( !_recordAccessTracker->checkAccessedAndMark( record ) ) { return new MmapV1RecordFetcher( record ); } @@ -300,7 +305,7 @@ namespace mongo { if ( doSanityCheck ) e->assertOk(); - _recordAccessTracker.markAccessed( e ); + _recordAccessTracker->markAccessed( e ); return e; } diff --git a/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.h b/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.h index 15958e15ef3..2c9d51a579e 100644 --- a/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.h +++ b/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.h @@ -196,7 +196,10 @@ namespace mongo { const std::string _path; // i.e. "/data/db" const bool _directoryPerDB; const ResourceId _rid; - mutable RecordAccessTracker _recordAccessTracker; + + // This reference points into the MMAPv1 engine and is only valid as long as the + // engine is valid. Not owned here. + RecordAccessTracker* _recordAccessTracker; /** * Simple wrapper around an array object to allow append-only modification of the array, |