diff options
-rw-r--r-- | jstests/core/dbstats.js | 11 | ||||
-rw-r--r-- | jstests/noPassthroughWithMongod/free_storage_size.js | 2 | ||||
-rw-r--r-- | src/mongo/db/catalog/database.h | 1 | ||||
-rw-r--r-- | src/mongo/db/catalog/database_impl.cpp | 31 | ||||
-rw-r--r-- | src/mongo/db/catalog/database_impl.h | 5 | ||||
-rw-r--r-- | src/mongo/db/commands/dbcommands.cpp | 3 | ||||
-rw-r--r-- | src/mongo/shell/db.js | 15 |
7 files changed, 52 insertions, 16 deletions
diff --git a/jstests/core/dbstats.js b/jstests/core/dbstats.js index dff5e370702..76d77f29b5b 100644 --- a/jstests/core/dbstats.js +++ b/jstests/core/dbstats.js @@ -2,7 +2,7 @@ // // @tags: [ // requires_dbstats, -// requires_fcv_47, +// requires_fcv_50 // ] (function() { @@ -34,7 +34,7 @@ const doc = { }; assert.commandWorked(coll.insert(doc)); -let dbStats = testDB.runCommand({dbStats: 1}); +let dbStats = testDB.runCommand({dbStats: 1, freeStorage: 1}); assert.commandWorked(dbStats); assert.eq(1, dbStats.objects, tojson(dbStats)); // Includes testColl only @@ -61,6 +61,13 @@ if (isUsingPersistentStorage) { assert(dbStats.hasOwnProperty("fsUsedSize"), tojson(dbStats)); assert(dbStats.hasOwnProperty("fsTotalSize"), tojson(dbStats)); + + // Make sure free storage size is not included by default + const defaultStats = testDB.runCommand({dbStats: 1}); + assert.commandWorked(defaultStats); + assert(!defaultStats.hasOwnProperty("freeStorageSize"), tojson(defaultStats)); + assert(!defaultStats.hasOwnProperty("indexFreeStorageSize"), tojson(defaultStats)); + assert(!defaultStats.hasOwnProperty("totalFreeStorageSize"), tojson(defaultStats)); } // Confirm collection and view counts on mongoD diff --git a/jstests/noPassthroughWithMongod/free_storage_size.js b/jstests/noPassthroughWithMongod/free_storage_size.js index 4c19cd13cf6..db16c671d6c 100644 --- a/jstests/noPassthroughWithMongod/free_storage_size.js +++ b/jstests/noPassthroughWithMongod/free_storage_size.js @@ -43,7 +43,7 @@ let collStats = assert.commandWorked(testDB.runCommand({collStats: collName})); assert(collStats.hasOwnProperty("freeStorageSize"), tojson(collStats)); assert.gt(collStats.freeStorageSize, 0); -let dbStats = assert.commandWorked(testDB.runCommand({dbStats: 1})); +let dbStats = assert.commandWorked(testDB.stats({freeStorage: 1})); assert(dbStats.hasOwnProperty("freeStorageSize"), tojson(dbStats)); assert.gt(dbStats.freeStorageSize, 0); assert.eq(dbStats.freeStorageSize, collStats.freeStorageSize); diff --git a/src/mongo/db/catalog/database.h b/src/mongo/db/catalog/database.h index b81b7939919..7051ac1c0ed 100644 --- a/src/mongo/db/catalog/database.h +++ b/src/mongo/db/catalog/database.h @@ -98,6 +98,7 @@ public: virtual void getStats(OperationContext* const opCtx, BSONObjBuilder* const output, + bool includeFreeStorage, const double scale = 1) const = 0; /** diff --git a/src/mongo/db/catalog/database_impl.cpp b/src/mongo/db/catalog/database_impl.cpp index 16f0ee7cbf9..b987ca758ca 100644 --- a/src/mongo/db/catalog/database_impl.cpp +++ b/src/mongo/db/catalog/database_impl.cpp @@ -248,7 +248,10 @@ bool DatabaseImpl::isDropPending(OperationContext* opCtx) const { return _dropPending.load(); } -void DatabaseImpl::getStats(OperationContext* opCtx, BSONObjBuilder* output, double scale) const { +void DatabaseImpl::getStats(OperationContext* opCtx, + BSONObjBuilder* output, + bool includeFreeStorage, + double scale) const { long long nCollections = 0; long long nViews = 0; @@ -270,11 +273,14 @@ void DatabaseImpl::getStats(OperationContext* opCtx, BSONObjBuilder* output, dou BSONObjBuilder temp; storageSize += collection->getRecordStore()->storageSize(opCtx, &temp); - freeStorageSize += collection->getRecordStore()->freeStorageSize(opCtx); indexes += collection->getIndexCatalog()->numIndexesTotal(opCtx); indexSize += collection->getIndexSize(opCtx); - indexFreeStorageSize += collection->getIndexFreeStorageBytes(opCtx); + + if (includeFreeStorage) { + freeStorageSize += collection->getRecordStore()->freeStorageSize(opCtx); + indexFreeStorageSize += collection->getIndexFreeStorageBytes(opCtx); + } return true; }); @@ -291,12 +297,19 @@ void DatabaseImpl::getStats(OperationContext* opCtx, BSONObjBuilder* output, dou output->append("avgObjSize", objects == 0 ? 0 : double(size) / double(objects)); output->appendNumber("dataSize", size / scale); output->appendNumber("storageSize", storageSize / scale); - output->appendNumber("freeStorageSize", freeStorageSize / scale); - output->appendNumber("indexes", indexes); - output->appendNumber("indexSize", indexSize / scale); - output->appendNumber("indexFreeStorageSize", indexFreeStorageSize / scale); - output->appendNumber("totalSize", (storageSize + indexSize) / scale); - output->appendNumber("totalFreeStorageSize", (freeStorageSize + indexFreeStorageSize) / scale); + if (includeFreeStorage) { + output->appendNumber("freeStorageSize", freeStorageSize / scale); + output->appendNumber("indexes", indexes); + output->appendNumber("indexSize", indexSize / scale); + output->appendNumber("indexFreeStorageSize", indexFreeStorageSize / scale); + output->appendNumber("totalSize", (storageSize + indexSize) / scale); + output->appendNumber("totalFreeStorageSize", + (freeStorageSize + indexFreeStorageSize) / scale); + } else { + output->appendNumber("indexes", indexes); + output->appendNumber("indexSize", indexSize / scale); + output->appendNumber("totalSize", (storageSize + indexSize) / scale); + } output->appendNumber("scaleFactor", scale); if (!opCtx->getServiceContext()->getStorageEngine()->isEphemeral()) { diff --git a/src/mongo/db/catalog/database_impl.h b/src/mongo/db/catalog/database_impl.h index 893d66588f6..c618e520136 100644 --- a/src/mongo/db/catalog/database_impl.h +++ b/src/mongo/db/catalog/database_impl.h @@ -49,7 +49,10 @@ public: bool isDropPending(OperationContext* opCtx) const final; - void getStats(OperationContext* opCtx, BSONObjBuilder* output, double scale = 1) const final; + void getStats(OperationContext* opCtx, + BSONObjBuilder* output, + bool includeFreeStorage, + double scale = 1) const final; /** * dropCollection() will refuse to drop system collections. Use dropCollectionEvenIfSystem() if diff --git a/src/mongo/db/commands/dbcommands.cpp b/src/mongo/db/commands/dbcommands.cpp index 6271aa58417..5bdab6c4127 100644 --- a/src/mongo/db/commands/dbcommands.cpp +++ b/src/mongo/db/commands/dbcommands.cpp @@ -724,6 +724,7 @@ public: errmsg = "scale has to be a number > 0"; return false; } + bool includeFreeStorage = jsobj["freeStorage"].trueValue(); const std::string ns = parseNs(dbname, jsobj); uassert(ErrorCodes::InvalidNamespace, @@ -771,7 +772,7 @@ public: dbname.c_str(), CollectionCatalog::get(opCtx)->getDatabaseProfileLevel(dbname)); } - db->getStats(opCtx, &result, scale); + db->getStats(opCtx, &result, includeFreeStorage, scale); } return true; diff --git a/src/mongo/shell/db.js b/src/mongo/shell/db.js index 7a30fd09477..a1e8fb59483 100644 --- a/src/mongo/shell/db.js +++ b/src/mongo/shell/db.js @@ -36,8 +36,19 @@ DB.prototype.getName = function() { return this._name; }; -DB.prototype.stats = function(scale) { - return this.runCommand({dbstats: 1, scale: scale}); +/** + * Gets DB level statistics. opt can be a number representing the scale for backwards compatibility + * or a document with options passed along to the dbstats command. + */ +DB.prototype.stats = function(opt) { + var cmd = {dbstats: 1}; + + if (opt === undefined) + return this.runCommand(cmd); + if (typeof (opt) !== "object") + return this.runCommand(Object.extend(cmd, {scale: opt})); + + return this.runCommand(Object.extend(cmd, opt)); }; DB.prototype.getCollection = function(name) { |