From a71460624e844335aa8d0268d411e3d3308c1445 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Mon, 5 Nov 2018 21:12:05 +0300 Subject: [PATCH 1/2] 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; } From 52685c144d18314fbb07fe3583d69041f29007c8 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Wed, 7 Nov 2018 02:03:06 +0300 Subject: [PATCH 2/2] Fixed - JDK 1.6 compatibility for 2.x base line. #1719 --- pom.xml | 2 +- .../redisson/client/handler/RedisChannelInitializer.java | 9 ++++++++- .../client/protocol/decoder/PendingResultDecoder.java | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 7ac44420a..8e8456d0b 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ true 1.6 1.8 - 7 + 6 UTF-8 diff --git a/redisson/src/main/java/org/redisson/client/handler/RedisChannelInitializer.java b/redisson/src/main/java/org/redisson/client/handler/RedisChannelInitializer.java index daf028f91..e034d1081 100644 --- a/redisson/src/main/java/org/redisson/client/handler/RedisChannelInitializer.java +++ b/redisson/src/main/java/org/redisson/client/handler/RedisChannelInitializer.java @@ -17,6 +17,7 @@ package org.redisson.client.handler; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.Method; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; @@ -155,7 +156,13 @@ public class RedisChannelInitializer extends ChannelInitializer { SSLParameters sslParams = new SSLParameters(); if (config.isSslEnableEndpointIdentification()) { - sslParams.setEndpointIdentificationAlgorithm("HTTPS"); + // TODO remove for JDK 1.7+ + try { + Method method = sslParams.getClass().getDeclaredMethod("setEndpointIdentificationAlgorithm", String.class); + method.invoke(sslParams, "HTTPS"); + } catch (Exception e) { + throw new SSLException(e); + } } else { if (config.getSslTruststore() == null) { sslContextBuilder.trustManager(InsecureTrustManagerFactory.INSTANCE); diff --git a/redisson/src/main/java/org/redisson/client/protocol/decoder/PendingResultDecoder.java b/redisson/src/main/java/org/redisson/client/protocol/decoder/PendingResultDecoder.java index c5db984b5..b67f1aa72 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/decoder/PendingResultDecoder.java +++ b/redisson/src/main/java/org/redisson/client/protocol/decoder/PendingResultDecoder.java @@ -45,7 +45,7 @@ public class PendingResultDecoder implements MultiDecoder { for (List mapping : customerParts) { consumerNames.put(mapping.get(0), Long.valueOf(mapping.get(1))); } - return new PendingResult((long)parts.get(0), convertor.convert(parts.get(1)), convertor.convert(parts.get(2)), consumerNames); + return new PendingResult((Long)parts.get(0), convertor.convert(parts.get(1)), convertor.convert(parts.get(2)), consumerNames); } }