Skip to content

Commit 52fb330

Browse files
committed
fix empty member bug in SerializedMappedSet
1 parent 72901fa commit 52fb330

2 files changed

Lines changed: 44 additions & 7 deletions

File tree

src/nl/melp/redis/collections/SerializedMappedSet.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,36 @@
77
import java.util.Collection;
88

99
public class SerializedMappedSet<K, V> implements Map<K, Set<V>> {
10+
private class SerializedMemberSet extends SerializedSet<V> {
11+
private final K key;
12+
13+
public SerializedMemberSet(K key, ISerializer<V> serializer, Redis redis, String keyName) {
14+
super(serializer, redis, keyName);
15+
this.key = key;
16+
17+
if (size() > 0) {
18+
keys.add(key);
19+
}
20+
}
21+
22+
@Override
23+
public void clear() {
24+
super.clear();
25+
keys.remove(key);
26+
cache.remove(key);
27+
}
28+
29+
@Override
30+
public boolean remove(Object o) {
31+
boolean removed = super.remove(o);
32+
if (removed && size() == 0) {
33+
keys.remove(key);
34+
cache.remove(key);
35+
}
36+
return removed;
37+
}
38+
}
39+
1040
private final byte[] prefix;
1141
private final int prefixLength;
1242

@@ -74,9 +104,8 @@ public Set<V> get(Object o) {
74104
synchronized (redis) {
75105
K key = (K)o;
76106

77-
this.keys.add(key);
78107
if (!this.cache.containsKey(key)) {
79-
this.cache.put(key, new SerializedSet<>(this.valueSerializer, this.redis, new String(this.withPrefix(this.keySerializer.serialize(key)))));
108+
this.cache.put(key, new SerializedMemberSet(key, this.valueSerializer, this.redis, new String(this.withPrefix(this.keySerializer.serialize(key)))));
80109
}
81110
return this.cache.get(o);
82111
}
@@ -96,6 +125,8 @@ public Set<V> put(K k, Set<V> vs) {
96125
public Set<V> remove(Object o) {
97126
synchronized (redis) {
98127
Set<V> vs = this.get(o);
128+
keys.remove(o);
129+
cache.remove(o);
99130
vs.clear();
100131
return vs;
101132
}

test/nl/melp/redis/collections/IntegrationTest.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -344,11 +344,7 @@ public void testSerializedMappedSetForInForEach() throws IOException {
344344
}
345345
}
346346

347-
map.forEach((k, v) -> {
348-
v.forEach(s -> {
349-
pairs2.add(k + "." + s);
350-
});
351-
});
347+
map.forEach((k, v) -> v.forEach(s -> pairs2.add(k + "." + s)));
352348

353349
Assert.assertEquals(6, pairs.size());
354350
for (String expected : new String[]{"A.1", "A.2", "A.3", "B.1", "B.2", "B.3",}) {
@@ -358,4 +354,14 @@ public void testSerializedMappedSetForInForEach() throws IOException {
358354

359355
map.clear();
360356
}
357+
358+
359+
@Test
360+
public void testSerializedMappedSetKeySynchronization() throws IOException {
361+
Map<String, Set<String>> map = new SerializedMappedSet<>(Serializers.of(String.class), Serializers.of(String.class), redis, keyName);
362+
Assert.assertEquals(0, map.get("A").size());
363+
Assert.assertEquals(0, map.size());
364+
map.remove("A");
365+
Assert.assertEquals(0, map.size());
366+
}
361367
}

0 commit comments

Comments
 (0)