summaryrefslogtreecommitdiff
path: root/src/mongo
diff options
context:
space:
mode:
authorDavid Storch <david.storch@10gen.com>2014-12-11 18:06:06 -0500
committerDavid Storch <david.storch@10gen.com>2014-12-12 17:16:52 -0500
commit2a148f717998b77199c3dd3d7d4e4e47eb1141ef (patch)
tree91b362ec333100c7d475c207950150efdd7091e7 /src/mongo
parent8fc0c842c03288c55a93db46241c5467ea17416e (diff)
downloadmongo-2a148f717998b77199c3dd3d7d4e4e47eb1141ef.tar.gz
SERVER-16515 change RecordAccessTracker to be per-MMAPv1 engine, not per-MMAPv1 database
Diffstat (limited to 'src/mongo')
-rw-r--r--src/mongo/db/storage/mmap_v1/mmap_v1_engine.cpp4
-rw-r--r--src/mongo/db/storage/mmap_v1/mmap_v1_engine.h20
-rw-r--r--src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp13
-rw-r--r--src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.h5
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,