From b451379c2f6da834a24d230bc9f1355660da3e7c Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 16 Jul 2020 17:23:24 +0300 Subject: [PATCH] Update eviction queue before size See gh-25298 --- .../messaging/simp/broker/DefaultSubscriptionRegistry.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java index bac3ef6ca0b..006346d55f0 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java @@ -263,8 +263,9 @@ public class DefaultSubscriptionRegistry extends AbstractSubscriptionRegistry { if (sessionIdToSubscriptionIds == null) { sessionIdToSubscriptionIds = this.destinationCache.computeIfAbsent(destination, _destination -> { LinkedMultiValueMap matches = computeMatchingSubscriptions(destination); - this.cacheSize.incrementAndGet(); + // Update queue first, so that cacheSize <= queue.size( this.cacheEvictionPolicy.add(destination); + this.cacheSize.incrementAndGet(); return matches; }); ensureCacheLimit(); @@ -309,7 +310,9 @@ public class DefaultSubscriptionRegistry extends AbstractSubscriptionRegistry { if (size > cacheLimit) { do { if (this.cacheSize.compareAndSet(size, size - 1)) { - this.destinationCache.remove(this.cacheEvictionPolicy.poll()); + // Remove (vs poll): we expect an element + String head = this.cacheEvictionPolicy.remove(); + this.destinationCache.remove(head); } } while ((size = this.cacheSize.get()) > cacheLimit); }