summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mongo/db/catalog/database_impl.cpp7
-rw-r--r--src/mongo/db/storage/kv/kv_catalog.cpp8
-rw-r--r--src/mongo/db/storage/kv/kv_catalog.h2
-rw-r--r--src/mongo/db/storage/kv/kv_storage_engine.cpp4
-rw-r--r--src/mongo/db/storage/kv/kv_storage_engine.h2
-rw-r--r--src/mongo/db/storage/mmap_v1/mmap_v1_engine.cpp9
-rw-r--r--src/mongo/db/storage/mmap_v1/mmap_v1_engine.h2
-rw-r--r--src/mongo/db/storage/storage_engine.h5
8 files changed, 34 insertions, 5 deletions
diff --git a/src/mongo/db/catalog/database_impl.cpp b/src/mongo/db/catalog/database_impl.cpp
index 9e5fb366c38..626df16fad8 100644
--- a/src/mongo/db/catalog/database_impl.cpp
+++ b/src/mongo/db/catalog/database_impl.cpp
@@ -414,11 +414,8 @@ void DatabaseImpl::getStats(OperationContext* opCtx, BSONObjBuilder* output, dou
_dbEntry->appendExtraStats(opCtx, output, scale);
if (!opCtx->getServiceContext()->getGlobalStorageEngine()->isEphemeral()) {
- boost::filesystem::path dbpath(storageGlobalParams.dbpath);
- if (storageGlobalParams.directoryperdb) {
- dbpath /= _name;
- }
-
+ boost::filesystem::path dbpath(
+ opCtx->getServiceContext()->getGlobalStorageEngine()->getFilesystemPathForDb(_name));
boost::system::error_code ec;
boost::filesystem::space_info spaceInfo = boost::filesystem::space(dbpath, ec);
if (!ec) {
diff --git a/src/mongo/db/storage/kv/kv_catalog.cpp b/src/mongo/db/storage/kv/kv_catalog.cpp
index 2f6773b116a..194ac3a40ec 100644
--- a/src/mongo/db/storage/kv/kv_catalog.cpp
+++ b/src/mongo/db/storage/kv/kv_catalog.cpp
@@ -286,6 +286,14 @@ bool KVCatalog::_hasEntryCollidingWithRand() const {
return false;
}
+std::string KVCatalog::getFilesystemPathForDb(const std::string& dbName) const {
+ if (_directoryPerDb) {
+ return storageGlobalParams.dbpath + '/' + NamespaceString::escapeDbName(dbName);
+ } else {
+ return storageGlobalParams.dbpath;
+ }
+}
+
std::string KVCatalog::_newUniqueIdent(StringData ns, const char* kind) {
// If this changes to not put _rand at the end, _hasEntryCollidingWithRand will need fixing.
StringBuilder buf;
diff --git a/src/mongo/db/storage/kv/kv_catalog.h b/src/mongo/db/storage/kv/kv_catalog.h
index efceb500ea1..5735f0764ab 100644
--- a/src/mongo/db/storage/kv/kv_catalog.h
+++ b/src/mongo/db/storage/kv/kv_catalog.h
@@ -99,6 +99,8 @@ public:
return _featureTracker.get();
}
+ std::string getFilesystemPathForDb(const std::string& dbName) const;
+
private:
class AddIdentChange;
class RemoveIdentChange;
diff --git a/src/mongo/db/storage/kv/kv_storage_engine.cpp b/src/mongo/db/storage/kv/kv_storage_engine.cpp
index ec14caef467..e68df274369 100644
--- a/src/mongo/db/storage/kv/kv_storage_engine.cpp
+++ b/src/mongo/db/storage/kv/kv_storage_engine.cpp
@@ -232,6 +232,10 @@ KVStorageEngine::reconcileCatalogAndIdents(OperationContext* opCtx) {
return ret;
}
+std::string KVStorageEngine::getFilesystemPathForDb(const std::string& dbName) const {
+ return _catalog->getFilesystemPathForDb(dbName);
+}
+
void KVStorageEngine::cleanShutdown() {
for (DBMap::const_iterator it = _dbs.begin(); it != _dbs.end(); ++it) {
delete it->second;
diff --git a/src/mongo/db/storage/kv/kv_storage_engine.h b/src/mongo/db/storage/kv/kv_storage_engine.h
index 26518e861a5..0660c8354c6 100644
--- a/src/mongo/db/storage/kv/kv_storage_engine.h
+++ b/src/mongo/db/storage/kv/kv_storage_engine.h
@@ -153,6 +153,8 @@ public:
StatusWith<std::vector<StorageEngine::CollectionIndexNamePair>> reconcileCatalogAndIdents(
OperationContext* opCtx) override;
+ std::string getFilesystemPathForDb(const std::string& dbName) const override;
+
private:
class RemoveDBChange;
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 8e9fdc78679..2720b84fde5 100644
--- a/src/mongo/db/storage/mmap_v1/mmap_v1_engine.cpp
+++ b/src/mongo/db/storage/mmap_v1/mmap_v1_engine.cpp
@@ -409,4 +409,13 @@ void MMAPV1Engine::cleanShutdown() {
void MMAPV1Engine::setJournalListener(JournalListener* jl) {
dur::setJournalListener(jl);
}
+
+std::string MMAPV1Engine::getFilesystemPathForDb(const std::string& dbName) const {
+ if (storageGlobalParams.directoryperdb) {
+ return storageGlobalParams.dbpath + '/' + dbName;
+ } else {
+ return storageGlobalParams.dbpath;
+ }
+}
+
} // namespace mongo
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 8e77289fe95..55b00445134 100644
--- a/src/mongo/db/storage/mmap_v1/mmap_v1_engine.h
+++ b/src/mongo/db/storage/mmap_v1/mmap_v1_engine.h
@@ -110,6 +110,8 @@ public:
MONGO_UNREACHABLE;
}
+ std::string getFilesystemPathForDb(const std::string& dbName) const override;
+
private:
static void _listDatabases(const std::string& directory, std::vector<std::string>* out);
diff --git a/src/mongo/db/storage/storage_engine.h b/src/mongo/db/storage/storage_engine.h
index 579f7d2a131..57fced623c2 100644
--- a/src/mongo/db/storage/storage_engine.h
+++ b/src/mongo/db/storage/storage_engine.h
@@ -365,6 +365,11 @@ public:
*/
virtual Timestamp getAllCommittedTimestamp() const = 0;
+ /**
+ * Returns the path to the directory which has the data files of database with `dbName`.
+ */
+ virtual std::string getFilesystemPathForDb(const std::string& dbName) const = 0;
+
protected:
/**
* The destructor will never be called. See cleanShutdown instead.