diff --git a/redisson/src/main/java/org/redisson/RedissonMap.java b/redisson/src/main/java/org/redisson/RedissonMap.java index 1570ce418..489546c80 100644 --- a/redisson/src/main/java/org/redisson/RedissonMap.java +++ b/redisson/src/main/java/org/redisson/RedissonMap.java @@ -1185,7 +1185,7 @@ public class RedissonMap extends RedissonExpirable implements RMap { public void run() { final V value = options.getLoader().load(key); if (value == null) { - result.trySuccess(value); + unlock(result, lock, threadId, value); return; } diff --git a/redisson/src/test/java/org/redisson/BaseMapTest.java b/redisson/src/test/java/org/redisson/BaseMapTest.java index 6278384b9..416a634ba 100644 --- a/redisson/src/test/java/org/redisson/BaseMapTest.java +++ b/redisson/src/test/java/org/redisson/BaseMapTest.java @@ -19,6 +19,19 @@ public abstract class BaseMapTest extends BaseTest { protected abstract RMap getLoaderTestMap(String name, Map map); + @Test + public void testMapLoaderGetMulipleNulls() { + Map cache = new HashMap(); + cache.put("1", "11"); + cache.put("2", "22"); + cache.put("3", "33"); + + RMap map = getLoaderTestMap("test", cache); + assertThat(map.get("0")).isNull(); + assertThat(map.get("1")).isEqualTo("11"); + assertThat(map.get("0")).isNull(); // This line will never return anything and the test will hang + } + @Test public void testWriterAddAndGet() { Map store = new HashMap<>();