From a71460624e844335aa8d0268d411e3d3308c1445 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Mon, 5 Nov 2018 21:12:05 +0300 Subject: [PATCH] Fixed - OOM when using RLocalCachedMap.fastPut and Reference based EvictionPolicy. #1442 --- .../org/redisson/cache/AbstractCacheMap.java | 9 +------ .../redisson/cache/CachedValueReference.java | 27 +++++++++++++++++++ .../cache/CachedValueSoftReference.java | 3 ++- .../cache/CachedValueWeakReference.java | 3 ++- .../org/redisson/cache/ReferenceCacheMap.java | 8 +++++- 5 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 redisson/src/main/java/org/redisson/cache/CachedValueReference.java diff --git a/redisson/src/main/java/org/redisson/cache/AbstractCacheMap.java b/redisson/src/main/java/org/redisson/cache/AbstractCacheMap.java index 114e534aa..51135e882 100644 --- a/redisson/src/main/java/org/redisson/cache/AbstractCacheMap.java +++ b/redisson/src/main/java/org/redisson/cache/AbstractCacheMap.java @@ -221,14 +221,7 @@ public abstract class AbstractCacheMap implements Cache { protected abstract void onMapFull(); - boolean isFull() { - if (size == 0) { - return false; - } - return map.size() >= size; - } - - private boolean isFull(K key) { + protected boolean isFull(K key) { if (size == 0) { return false; } diff --git a/redisson/src/main/java/org/redisson/cache/CachedValueReference.java b/redisson/src/main/java/org/redisson/cache/CachedValueReference.java new file mode 100644 index 000000000..6e1073f8c --- /dev/null +++ b/redisson/src/main/java/org/redisson/cache/CachedValueReference.java @@ -0,0 +1,27 @@ +/** + * Copyright 2018 Nikita Koksharov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.redisson.cache; + +/** + * + * @author Nikita Koksharov + * + */ +public interface CachedValueReference { + + CachedValue getOwner(); + +} diff --git a/redisson/src/main/java/org/redisson/cache/CachedValueSoftReference.java b/redisson/src/main/java/org/redisson/cache/CachedValueSoftReference.java index 8d7263d78..974c816b3 100644 --- a/redisson/src/main/java/org/redisson/cache/CachedValueSoftReference.java +++ b/redisson/src/main/java/org/redisson/cache/CachedValueSoftReference.java @@ -24,7 +24,7 @@ import java.lang.ref.SoftReference; * * @param value type */ -public class CachedValueSoftReference extends SoftReference { +public class CachedValueSoftReference extends SoftReference implements CachedValueReference { private final CachedValue owner; @@ -33,6 +33,7 @@ public class CachedValueSoftReference extends SoftReference { this.owner = owner; } + @Override public CachedValue getOwner() { return owner; } diff --git a/redisson/src/main/java/org/redisson/cache/CachedValueWeakReference.java b/redisson/src/main/java/org/redisson/cache/CachedValueWeakReference.java index 1301a7366..37ed9071c 100644 --- a/redisson/src/main/java/org/redisson/cache/CachedValueWeakReference.java +++ b/redisson/src/main/java/org/redisson/cache/CachedValueWeakReference.java @@ -24,7 +24,7 @@ import java.lang.ref.WeakReference; * * @param value type */ -public class CachedValueWeakReference extends WeakReference { +public class CachedValueWeakReference extends WeakReference implements CachedValueReference { private final CachedValue owner; @@ -33,6 +33,7 @@ public class CachedValueWeakReference extends WeakReference { this.owner = owner; } + @Override public CachedValue getOwner() { return owner; } diff --git a/redisson/src/main/java/org/redisson/cache/ReferenceCacheMap.java b/redisson/src/main/java/org/redisson/cache/ReferenceCacheMap.java index 2b71e7da4..73b386f4b 100644 --- a/redisson/src/main/java/org/redisson/cache/ReferenceCacheMap.java +++ b/redisson/src/main/java/org/redisson/cache/ReferenceCacheMap.java @@ -45,14 +45,20 @@ public class ReferenceCacheMap extends AbstractCacheMap { this.type = type; } + @Override protected CachedValue create(K key, V value, long ttl, long maxIdleTime) { return new ReferenceCachedValue(key, value, ttl, maxIdleTime, queue, type); } + + @Override + protected boolean isFull(K key) { + return true; + } @Override protected boolean removeExpiredEntries() { while (true) { - CachedValueSoftReference value = (CachedValueSoftReference) queue.poll(); + CachedValueReference value = (CachedValueReference) queue.poll(); if (value == null) { break; }