summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands/list_databases.cpp
diff options
context:
space:
mode:
authorGeert Bosch <geert@mongodb.com>2017-02-17 19:06:48 -0500
committerGeert Bosch <geert@mongodb.com>2017-02-19 21:41:21 -0500
commitef5a80fb0f1900d3e82dc8c60a536f17dd4d1268 (patch)
tree4d50837f88e53420c18de13794f3c21bfea9b80a /src/mongo/db/commands/list_databases.cpp
parentfff6d490ce43a6d3952cf2352f81c524b20e6f49 (diff)
downloadmongo-ef5a80fb0f1900d3e82dc8c60a536f17dd4d1268.tar.gz
SERVER-28049 Apply name-only filters before locking in listDatabases
Diffstat (limited to 'src/mongo/db/commands/list_databases.cpp')
-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);