Skip to content

Commit ddf7a33

Browse files
uhm0311jhpark816
authored andcommitted
FIX: Make sure to create readonly copy of locator that has same shape with original one.
1 parent eee0b46 commit ddf7a33

2 files changed

Lines changed: 26 additions & 31 deletions

File tree

src/main/java/net/spy/memcached/ArcusKetamaNodeLocator.java

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -175,31 +175,28 @@ public Iterator<MemcachedNode> getSequence(String k) {
175175
}
176176

177177
public NodeLocator getReadonlyCopy() {
178-
TreeMap<Long, SortedSet<MemcachedNode>> smn =
179-
new TreeMap<>(ketamaNodes);
180-
Collection<MemcachedNode> an = new ArrayList<>(
181-
allNodes.size());
182-
183178
lock.lock();
184179
try {
180+
TreeMap<Long, SortedSet<MemcachedNode>> ketamaCopy = new TreeMap<>();
181+
Collection<MemcachedNode> nodesCopy = new ArrayList<>(allNodes.size());
182+
185183
// Rewrite the values a copy of the map.
186-
for (Map.Entry<Long, SortedSet<MemcachedNode>> me : smn.entrySet()) {
187-
SortedSet<MemcachedNode> nodeROSet =
188-
new TreeSet<>(config.new NodeNameComparator());
189-
for (MemcachedNode mn : me.getValue()) {
190-
nodeROSet.add(new MemcachedNodeROImpl(mn));
184+
for (Map.Entry<Long, SortedSet<MemcachedNode>> hashPoint : ketamaNodes.entrySet()) {
185+
SortedSet<MemcachedNode> nodeROSet = new TreeSet<>(config.new NodeNameComparator());
186+
for (MemcachedNode node : hashPoint.getValue()) {
187+
nodeROSet.add(new MemcachedNodeROImpl(node));
191188
}
192-
me.setValue(nodeROSet);
189+
ketamaCopy.put(hashPoint.getKey(), nodeROSet);
193190
}
194191
// Copy the allNodes collection.
195-
for (MemcachedNode n : allNodes) {
196-
an.add(new MemcachedNodeROImpl(n));
192+
for (MemcachedNode node : allNodes) {
193+
nodesCopy.add(new MemcachedNodeROImpl(node));
197194
}
195+
196+
return new ArcusKetamaNodeLocator(ketamaCopy, nodesCopy, config);
198197
} finally {
199198
lock.unlock();
200199
}
201-
202-
return new ArcusKetamaNodeLocator(smn, an, config);
203200
}
204201

205202
public void update(Collection<MemcachedNode> toAttach,

src/main/java/net/spy/memcached/ArcusReplKetamaNodeLocator.java

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -205,36 +205,34 @@ public Iterator<MemcachedNode> getSequence(String k, ReplicaPick pick) {
205205
}
206206

207207
public NodeLocator getReadonlyCopy() {
208-
TreeMap<Long, SortedSet<MemcachedReplicaGroup>> smg =
209-
new TreeMap<>(ketamaGroups);
210-
HashMap<String, MemcachedReplicaGroup> ag =
211-
new HashMap<>(allGroups.size());
212-
Collection<MemcachedNode> an = new ArrayList<>(allNodes.size());
213-
214208
lock.lock();
215209
try {
210+
TreeMap<Long, SortedSet<MemcachedReplicaGroup>> ketamaCopy = new TreeMap<>();
211+
HashMap<String, MemcachedReplicaGroup> groupsCopy = new HashMap<>(allGroups.size());
212+
Collection<MemcachedNode> nodesCopy = new ArrayList<>(allNodes.size());
213+
216214
// Rewrite the values a copy of the map
217-
for (Map.Entry<Long, SortedSet<MemcachedReplicaGroup>> mge : smg.entrySet()) {
215+
for (Map.Entry<Long, SortedSet<MemcachedReplicaGroup>> hashPoint : ketamaGroups.entrySet()) {
218216
SortedSet<MemcachedReplicaGroup> groupROSet = new TreeSet<>(
219217
new ArcusReplKetamaNodeLocatorConfiguration.MemcachedReplicaGroupComparator());
220-
for (MemcachedReplicaGroup mrg : mge.getValue()) {
221-
groupROSet.add(new MemcachedReplicaGroupROImpl(mrg));
218+
for (MemcachedReplicaGroup group : hashPoint.getValue()) {
219+
groupROSet.add(new MemcachedReplicaGroupROImpl(group));
222220
}
223-
mge.setValue(groupROSet);
221+
ketamaCopy.put(hashPoint.getKey(), groupROSet);
224222
}
225223
// copy the allGroups collection.
226-
for (Map.Entry<String, MemcachedReplicaGroup> me : allGroups.entrySet()) {
227-
ag.put(me.getKey(), new MemcachedReplicaGroupROImpl(me.getValue()));
224+
for (Map.Entry<String, MemcachedReplicaGroup> group : allGroups.entrySet()) {
225+
groupsCopy.put(group.getKey(), new MemcachedReplicaGroupROImpl(group.getValue()));
228226
}
229227
// copy the allNodes collection.
230-
for (MemcachedNode n : allNodes) {
231-
an.add(new MemcachedNodeROImpl(n));
228+
for (MemcachedNode node : allNodes) {
229+
nodesCopy.add(new MemcachedNodeROImpl(node));
232230
}
231+
232+
return new ArcusReplKetamaNodeLocator(ketamaCopy, groupsCopy, nodesCopy);
233233
} finally {
234234
lock.unlock();
235235
}
236-
237-
return new ArcusReplKetamaNodeLocator(smg, ag, an);
238236
}
239237

240238
public void update(Collection<MemcachedNode> toAttach, Collection<MemcachedNode> toDelete) {

0 commit comments

Comments
 (0)