Skip to content

Commit 8374b48

Browse files
dantewangslnn
authored andcommitted
LPD-41245 Apply key-hashing improvement for Ehcache 3 from Spring-framework spring-projects/spring-framework#34483
1 parent 30bcea5 commit 8374b48

File tree

5 files changed

+80
-22
lines changed

5 files changed

+80
-22
lines changed

modules/apps/portal-cache/portal-cache-ehcache-impl/src/main/java/com/liferay/portal/cache/ehcache/internal/BaseEhcachePortalCache.java

+13-17
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import java.time.temporal.ChronoUnit;
2222

2323
import java.util.ArrayList;
24-
import java.util.Collections;
2524
import java.util.List;
2625
import java.util.Map;
2726

@@ -54,25 +53,22 @@ public BaseEhcachePortalCache(
5453
@Override
5554
@SuppressWarnings("unchecked")
5655
public List<K> getKeys() {
56+
List<K> keys = new ArrayList<>();
57+
5758
Cache<?, ?> cache = getEhcache();
5859

59-
List<K> rawKeys = new ArrayList<>();
60+
cache.forEach(
61+
entry -> {
62+
EhcacheKey ehcacheKey = (EhcacheKey)entry.getKey();
6063

61-
cache.forEach(entry -> rawKeys.add((K)entry.getKey()));
64+
Object key = ehcacheKey.getKey();
6265

63-
if (!_serializable) {
64-
return rawKeys;
65-
}
66+
if (_serializable) {
67+
key = SerializableObjectWrapper.unwrap(key);
68+
}
6669

67-
if (rawKeys.isEmpty()) {
68-
return Collections.emptyList();
69-
}
70-
71-
List<K> keys = new ArrayList<>(rawKeys.size());
72-
73-
for (Object object : rawKeys) {
74-
keys.add(SerializableObjectWrapper.unwrap(object));
75-
}
70+
keys.add((K)key);
71+
});
7672

7773
return keys;
7874
}
@@ -209,10 +205,10 @@ private V _getValue(Object value) {
209205

210206
private Object _wrapKey(K key) {
211207
if (!_serializable) {
212-
return key;
208+
return new EhcacheKey(key);
213209
}
214210

215-
return new SerializableObjectWrapper(key);
211+
return new EhcacheKey(new SerializableObjectWrapper(key));
216212
}
217213

218214
private Object _wrapValue(V value, int timeToLive) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/**
2+
* SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com
3+
* SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
4+
*/
5+
6+
package com.liferay.portal.cache.ehcache.internal;
7+
8+
import java.io.Serializable;
9+
10+
import java.util.Objects;
11+
12+
/**
13+
* @author Dante Wang
14+
*/
15+
public class EhcacheKey implements Serializable {
16+
17+
public EhcacheKey(Object key) {
18+
_key = key;
19+
20+
// See https://github.com/spring-projects/spring-framework/issues/34483
21+
22+
int hashCode = _key.hashCode();
23+
24+
hashCode = (hashCode ^ (hashCode >>> 16)) * 0x85ebca6b;
25+
hashCode = (hashCode ^ (hashCode >>> 13)) * 0xc2b2ae35;
26+
hashCode = hashCode ^ (hashCode >>> 16);
27+
28+
_hashCode = hashCode;
29+
}
30+
31+
@Override
32+
public boolean equals(Object other) {
33+
if (this == other) {
34+
return true;
35+
}
36+
37+
if (!(other instanceof EhcacheKey ehcacheKey)) {
38+
return false;
39+
}
40+
41+
return Objects.equals(_key, ehcacheKey._key);
42+
}
43+
44+
public Object getKey() {
45+
return _key;
46+
}
47+
48+
@Override
49+
public int hashCode() {
50+
return _hashCode;
51+
}
52+
53+
private final int _hashCode;
54+
private final Object _key;
55+
56+
}

modules/apps/portal-cache/portal-cache-ehcache-impl/src/main/java/com/liferay/portal/cache/ehcache/internal/event/PortalCacheCacheEventListener.java

+5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.liferay.petra.string.StringPool;
1010
import com.liferay.portal.cache.AggregatedPortalCacheListener;
1111
import com.liferay.portal.cache.ehcache.internal.BaseEhcachePortalCache;
12+
import com.liferay.portal.cache.ehcache.internal.EhcacheKey;
1213
import com.liferay.portal.cache.ehcache.internal.EhcacheValue;
1314
import com.liferay.portal.cache.io.SerializableObjectWrapper;
1415
import com.liferay.portal.kernel.cache.PortalCache;
@@ -132,6 +133,10 @@ _portalCache, _getKey(key), _getValue(newValue),
132133

133134
@SuppressWarnings("unchecked")
134135
private K _getKey(Object key) {
136+
EhcacheKey ehcacheKey = (EhcacheKey)key;
137+
138+
key = ehcacheKey.getKey();
139+
135140
if (_requireSerialization) {
136141
return SerializableObjectWrapper.unwrap(key);
137142
}

modules/apps/portal-cache/portal-cache-ehcache-impl/src/test/java/com/liferay/portal/cache/ehcache/internal/BaseEhcachePortalCacheTest.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,7 @@ public void testTimeToLive() {
789789

790790
// Put if absent
791791

792-
cache.remove(_KEY_2);
792+
cache.remove(new EhcacheKey(_KEY_2));
793793

794794
_ehcachePortalCache.putIfAbsent(_KEY_2, _VALUE_2, timeToLive);
795795

@@ -805,7 +805,7 @@ public void testTimeToLive() {
805805

806806
// Replace 1
807807

808-
cache.remove(_KEY_2);
808+
cache.remove(new EhcacheKey(_KEY_2));
809809

810810
_ehcachePortalCache.replace(_KEY_1, _VALUE_2, timeToLive);
811811

@@ -822,7 +822,7 @@ public void testTimeToLive() {
822822

823823
// Replace 2
824824

825-
cache.remove(_KEY_1);
825+
cache.remove(new EhcacheKey(_KEY_1));
826826

827827
_ehcachePortalCache.put(_KEY_1, _VALUE_1);
828828

modules/apps/portal-cache/portal-cache-ehcache-impl/src/test/java/com/liferay/portal/cache/ehcache/internal/ShardedEhcachePortalCacheTest.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ public void testGetKeys() {
288288
_companyIdThreadLocal.set(_TEST_COMPANY_ID_1);
289289

290290
Assert.assertEquals(
291-
Arrays.asList(_TEST_KEY_1, _TEST_KEY_SYSTEM),
291+
Arrays.asList(_TEST_KEY_SYSTEM, _TEST_KEY_1),
292292
_shardedEhcachePortalCache.getKeys());
293293

294294
_companyIdThreadLocal.set(_TEST_COMPANY_ID_2);
@@ -741,7 +741,8 @@ private void _assertTimeToLive(
741741
_getShardedCacheName(_TEST_CACHE_NAME, companyId), Object.class,
742742
Object.class);
743743

744-
EhcacheValue ehcacheValue = (EhcacheValue)cache.get(key);
744+
EhcacheValue ehcacheValue = (EhcacheValue)cache.get(
745+
new EhcacheKey(key));
745746

746747
Assert.assertEquals(value, ehcacheValue.getValue());
747748

0 commit comments

Comments
 (0)