summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mongo/db/commands/list_databases.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/mongo/db/commands/list_databases.cpp b/src/mongo/db/commands/list_databases.cpp
index 6f94c6bda92..08de6f6cd6f 100644
--- a/src/mongo/db/commands/list_databases.cpp
+++ b/src/mongo/db/commands/list_databases.cpp
@@ -43,6 +43,7 @@
namespace mongo {
namespace {
static const StringData kFilterField{"filter"};
+static const StringData kNameField{"name"};
static const StringData kNameOnlyField{"nameOnly"};
} // namespace
@@ -120,6 +121,7 @@ public:
vector<BSONObj> dbInfos;
+ bool filterNameOnly = filter && filter->isLeaf() && filter->path() == kNameField;
intmax_t totalSize = 0;
for (vector<string>::iterator i = dbNames.begin(); i != dbNames.end(); ++i) {
const string& dbname = *i;
@@ -129,6 +131,10 @@ public:
int64_t size = 0;
if (!nameOnly) {
+ // Filtering on name only should not require taking locks on filtered-out names.
+ if (filterNameOnly && !filter->matchesBSON(b.asTempObj()))
+ continue;
+
ScopedTransaction transaction(txn, MODE_IS);
Lock::DBLock dbLock(txn->lockState(), dbname, MODE_IS);