summaryrefslogtreecommitdiff
path: root/src/mongo/util
diff options
context:
space:
mode:
authorVarun Ravichandran <varun.ravichandran@mongodb.com>2021-09-16 21:04:36 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-11-09 19:05:43 +0000
commitd46d2efc689cb7b1b4fb2df9f656d5dc3d7a5fc9 (patch)
treea4275664db8d2dad3db13b22a77af15f57cdc0f1 /src/mongo/util
parentba5d667c9a3f3105e0d68babc42a5b2d36524062 (diff)
downloadmongo-d46d2efc689cb7b1b4fb2df9f656d5dc3d7a5fc9.tar.gz
SERVER-59148: Periodically refresh LDAP users in authorization user cache
Diffstat (limited to 'src/mongo/util')
-rw-r--r--src/mongo/util/invalidating_lru_cache.h26
-rw-r--r--src/mongo/util/read_through_cache.h23
2 files changed, 49 insertions, 0 deletions
diff --git a/src/mongo/util/invalidating_lru_cache.h b/src/mongo/util/invalidating_lru_cache.h
index f2307dc007f..d07eb12e0ec 100644
--- a/src/mongo/util/invalidating_lru_cache.h
+++ b/src/mongo/util/invalidating_lru_cache.h
@@ -535,6 +535,32 @@ public:
}
}
+ /**
+ * Returns a vector of ValueHandles for all of the entries that satisfy matchPredicate.
+ */
+ template <typename Pred>
+ std::vector<ValueHandle> getEntriesIf(Pred matchPredicate) {
+ std::vector<ValueHandle> entries;
+ entries.reserve(_cache.size() + _evictedCheckedOutValues.size());
+ {
+ stdx::lock_guard lg(_mutex);
+ for (const auto& entry : _cache) {
+ if (matchPredicate(entry.first, &entry.second->value)) {
+ entries.push_back(ValueHandle(entry.second));
+ }
+ }
+
+ for (const auto& entry : _evictedCheckedOutValues) {
+ if (auto storedValue = entry.second.lock()) {
+ if (matchPredicate(entry.first, &storedValue->value)) {
+ entries.push_back(ValueHandle(std::move(storedValue)));
+ }
+ }
+ }
+ }
+ return entries;
+ }
+
struct CachedItemInfo {
Key key; // The key of the item in the cache
long int useCount; // The number of callers of 'get', which still have the item checked-out
diff --git a/src/mongo/util/read_through_cache.h b/src/mongo/util/read_through_cache.h
index 2fe230bdd41..65c5a39d96c 100644
--- a/src/mongo/util/read_through_cache.h
+++ b/src/mongo/util/read_through_cache.h
@@ -430,6 +430,29 @@ public:
}
/**
+ * Returns a vector of ValueHandles for all of the keys that satisfy matchPredicate.
+ */
+ template <typename Pred>
+ std::vector<ValueHandle> getValueHandlesIfKey(const Pred& matchPredicate) {
+ auto invalidatingCacheValues = [&]() {
+ stdx::lock_guard lg(_mutex);
+ return _cache.getEntriesIf(
+ [&](const Key& key, const StoredValue*) { return matchPredicate(key); });
+ }();
+
+ std::vector<ValueHandle> valueHandles;
+ valueHandles.reserve(invalidatingCacheValues.size());
+ std::transform(invalidatingCacheValues.begin(),
+ invalidatingCacheValues.end(),
+ std::back_inserter(valueHandles),
+ [](auto& invalidatingCacheValue) {
+ return ValueHandle(std::move(invalidatingCacheValue));
+ });
+
+ return valueHandles;
+ }
+
+ /**
* Returns statistics information about the cache for reporting purposes.
*/
std::vector<typename Cache::CachedItemInfo> getCacheInfo() const {