From b4339db12bf57ffee5b84a95c6919dbd35fe31c9 Mon Sep 17 00:00:00 2001 From: Xiangyu Yao Date: Wed, 28 Nov 2018 19:12:16 -0500 Subject: SERVER-35732 Fix dbStats.fsUsedSize behavior for database with hyphenated names (cherry picked from commit e0be8ba5aa04df21f6a9a42578a349a4c303776d) (cherry picked from commit cdf15b6db2e30f51c785c8e2c56472e793a7db69) --- src/mongo/db/catalog/database_impl.cpp | 7 ++----- src/mongo/db/storage/kv/kv_catalog.cpp | 8 ++++++++ src/mongo/db/storage/kv/kv_catalog.h | 2 ++ src/mongo/db/storage/kv/kv_storage_engine.cpp | 4 ++++ src/mongo/db/storage/kv/kv_storage_engine.h | 2 ++ src/mongo/db/storage/mmap_v1/mmap_v1_engine.cpp | 9 +++++++++ src/mongo/db/storage/mmap_v1/mmap_v1_engine.h | 2 ++ src/mongo/db/storage/storage_engine.h | 5 +++++ 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> 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* 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. -- cgit v1.2.1