This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 8.5.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 3840fd3ecf648ddec3f862c9e43a0cd3003175c4 Author: Mark Thomas <ma...@apache.org> AuthorDate: Tue Jan 24 10:16:41 2023 +0000 Review all uses of LinkedHashMap#removeEldestEntry Ensure FIFO or LRU is used as appropriate. Add/expand existing comments to make intentions clearer. Don't override default load factor to retain size/performance balance. --- java/org/apache/catalina/authenticator/DigestAuthenticator.java | 4 ++++ java/org/apache/catalina/filters/CsrfPreventionFilter.java | 6 ++++++ java/org/apache/catalina/realm/LockOutRealm.java | 7 +++++-- java/org/apache/catalina/tribes/util/StringManager.java | 9 ++++----- java/org/apache/juli/OneLineFormatter.java | 4 ++++ java/org/apache/tomcat/util/res/StringManager.java | 9 ++++----- 6 files changed, 27 insertions(+), 12 deletions(-) diff --git a/java/org/apache/catalina/authenticator/DigestAuthenticator.java b/java/org/apache/catalina/authenticator/DigestAuthenticator.java index e43fabd244..5588119787 100644 --- a/java/org/apache/catalina/authenticator/DigestAuthenticator.java +++ b/java/org/apache/catalina/authenticator/DigestAuthenticator.java @@ -376,6 +376,10 @@ public class DigestAuthenticator extends AuthenticatorBase { setOpaque(sessionIdGenerator.generateSessionId()); } + /* + * This is a FIFO cache as using an older nonce should not delay its removal from the cache in favour of more + * recent values. + */ nonces = new LinkedHashMap<String, DigestAuthenticator.NonceInfo>() { private static final long serialVersionUID = 1L; diff --git a/java/org/apache/catalina/filters/CsrfPreventionFilter.java b/java/org/apache/catalina/filters/CsrfPreventionFilter.java index 5568c4cc6d..9c2d7549c1 100644 --- a/java/org/apache/catalina/filters/CsrfPreventionFilter.java +++ b/java/org/apache/catalina/filters/CsrfPreventionFilter.java @@ -343,6 +343,12 @@ public class CsrfPreventionFilter extends CsrfPreventionFilterBase { } + /** + * Despite its name, this is a FIFO cache not an LRU cache. Using an older nonce should not delay its removal from + * the cache in favour of more recent values. + * + * @param <T> The type held by this cache. + */ protected static class LruCache<T> implements NonceCache<T> { private static final long serialVersionUID = 1L; diff --git a/java/org/apache/catalina/realm/LockOutRealm.java b/java/org/apache/catalina/realm/LockOutRealm.java index 296aac7915..fe220e6c7b 100644 --- a/java/org/apache/catalina/realm/LockOutRealm.java +++ b/java/org/apache/catalina/realm/LockOutRealm.java @@ -86,8 +86,11 @@ public class LockOutRealm extends CombinedRealm { */ @Override protected synchronized void startInternal() throws LifecycleException { - // Configure the list of failed users to delete the oldest entry once it - // exceeds the specified size + /* + * Configure the list of failed users to delete the oldest entry once it exceeds the specified size. This is an + * LRU cache so if the cache size is exceeded the users who most recently failed authentication will be + * retained. + */ failedUsers = new LinkedHashMap<String, LockRecord>(cacheSize, 0.75f, true) { private static final long serialVersionUID = 1L; diff --git a/java/org/apache/catalina/tribes/util/StringManager.java b/java/org/apache/catalina/tribes/util/StringManager.java index fc4b8b5b21..4e349233bd 100644 --- a/java/org/apache/catalina/tribes/util/StringManager.java +++ b/java/org/apache/catalina/tribes/util/StringManager.java @@ -213,12 +213,11 @@ public class StringManager { Map<Locale, StringManager> map = managers.get(packageName); if (map == null) { /* - * Don't want the HashMap to be expanded beyond LOCALE_CACHE_SIZE. Expansion occurs when size() exceeds - * capacity. Therefore keep size at or below capacity. removeEldestEntry() executes after insertion - * therefore the test for removal needs to use one less than the maximum desired size - * + * Don't want the HashMap size to exceed LOCALE_CACHE_SIZE. Expansion occurs when size() exceeds capacity. + * Therefore keep size at or below capacity. removeEldestEntry() executes after insertion therefore the test + * for removal needs to use one less than the maximum desired size. Note this is an LRU cache. */ - map = new LinkedHashMap<Locale, StringManager>(LOCALE_CACHE_SIZE, 1, true) { + map = new LinkedHashMap<Locale, StringManager>(LOCALE_CACHE_SIZE, 0.75f, true) { private static final long serialVersionUID = 1L; @Override diff --git a/java/org/apache/juli/OneLineFormatter.java b/java/org/apache/juli/OneLineFormatter.java index 02b3f3bbd2..c287d60a15 100644 --- a/java/org/apache/juli/OneLineFormatter.java +++ b/java/org/apache/juli/OneLineFormatter.java @@ -254,6 +254,9 @@ public class OneLineFormatter extends Formatter { } + /* + * This is an LRU cache. + */ private static class ThreadNameCache extends LinkedHashMap<Integer, String> { private static final long serialVersionUID = 1L; @@ -261,6 +264,7 @@ public class OneLineFormatter extends Formatter { private final int cacheSize; public ThreadNameCache(int cacheSize) { + super(cacheSize, 0.75f, true); this.cacheSize = cacheSize; } diff --git a/java/org/apache/tomcat/util/res/StringManager.java b/java/org/apache/tomcat/util/res/StringManager.java index 094c93727a..fd570c15bd 100644 --- a/java/org/apache/tomcat/util/res/StringManager.java +++ b/java/org/apache/tomcat/util/res/StringManager.java @@ -220,12 +220,11 @@ public class StringManager { Map<Locale, StringManager> map = managers.get(packageName); if (map == null) { /* - * Don't want the HashMap to be expanded beyond LOCALE_CACHE_SIZE. Expansion occurs when size() exceeds - * capacity. Therefore keep size at or below capacity. removeEldestEntry() executes after insertion - * therefore the test for removal needs to use one less than the maximum desired size - * + * Don't want the HashMap size to exceed LOCALE_CACHE_SIZE. Expansion occurs when size() exceeds capacity. + * Therefore keep size at or below capacity. removeEldestEntry() executes after insertion therefore the test + * for removal needs to use one less than the maximum desired size. Note this is an LRU cache. */ - map = new LinkedHashMap<Locale, StringManager>(LOCALE_CACHE_SIZE, 1, true) { + map = new LinkedHashMap<Locale, StringManager>(LOCALE_CACHE_SIZE, 0.75f, true) { private static final long serialVersionUID = 1L; @Override --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org