summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Gómez Ferro <daniel.gomezferro@mongodb.com>2022-01-18 17:14:55 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-01-19 12:37:52 +0000
commitbd3f8756a321e70067e200b509b20c0795cc130b (patch)
treefa5053541d7e01229860e3fc4fb9e64bde8c2c07
parent8cff596482240e32e1d8249b6043bc75987541ca (diff)
downloadmongo-bd3f8756a321e70067e200b509b20c0795cc130b.tar.gz
SERVER-62277 Add `freeStorage` option to dbstats, off by defaultr5.0.6-rc1
-rw-r--r--jstests/core/dbstats.js11
-rw-r--r--jstests/noPassthroughWithMongod/free_storage_size.js2
-rw-r--r--src/mongo/db/catalog/database.h1
-rw-r--r--src/mongo/db/catalog/database_impl.cpp31
-rw-r--r--src/mongo/db/catalog/database_impl.h5
-rw-r--r--src/mongo/db/commands/dbcommands.cpp3
-rw-r--r--src/mongo/shell/db.js15
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) {