diff options
author | Geert Bosch <geert@mongodb.com> | 2017-02-17 19:06:48 -0500 |
---|---|---|
committer | Geert Bosch <geert@mongodb.com> | 2017-03-03 12:46:02 -0500 |
commit | 41ca3715262d3411bf2dad031318bea92795288a (patch) | |
tree | de95dcae38d499f5460e77caffeb0d0c368562e9 | |
parent | 1349ae75590dee95475c5098ec6babce415ebfff (diff) | |
download | mongo-41ca3715262d3411bf2dad031318bea92795288a.tar.gz |
SERVER-28049 Apply name-only filters before locking in listDatabases
(cherry picked from commit ef5a80fb0f1900d3e82dc8c60a536f17dd4d1268)
-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); |