diff options
author | Geert Bosch <geert@mongodb.com> | 2017-02-17 19:06:48 -0500 |
---|---|---|
committer | Geert Bosch <geert@mongodb.com> | 2017-02-19 21:41:21 -0500 |
commit | ef5a80fb0f1900d3e82dc8c60a536f17dd4d1268 (patch) | |
tree | 4d50837f88e53420c18de13794f3c21bfea9b80a /src/mongo/db/commands/list_databases.cpp | |
parent | fff6d490ce43a6d3952cf2352f81c524b20e6f49 (diff) | |
download | mongo-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.cpp | 6 |
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); |