3232import java .util .SortedSet ;
3333import java .util .TreeMap ;
3434import java .util .TreeSet ;
35+ import java .util .concurrent .CopyOnWriteArrayList ;
3536import java .util .concurrent .locks .Lock ;
3637import java .util .concurrent .locks .ReentrantLock ;
3738
@@ -42,7 +43,7 @@ public class ArcusReplKetamaNodeLocator extends SpyObject implements NodeLocator
4243
4344 private final TreeMap <Long , SortedSet <MemcachedReplicaGroup >> ketamaGroups ;
4445 private final HashMap <String , MemcachedReplicaGroup > allGroups ;
45- private final Collection <MemcachedNode > allNodes ;
46+ private Collection <MemcachedNode > allNodes ;
4647
4748 /* ENABLE_MIGRATION if */
4849 private TreeMap <Long , SortedSet <MemcachedReplicaGroup >> ketamaAlterGroups ;
@@ -65,7 +66,7 @@ public class ArcusReplKetamaNodeLocator extends SpyObject implements NodeLocator
6566
6667 public ArcusReplKetamaNodeLocator (List <MemcachedNode > nodes ) {
6768 super ();
68- allNodes = nodes ;
69+ allNodes = new CopyOnWriteArrayList <>( nodes ) ;
6970 ketamaGroups = new TreeMap <>();
7071 allGroups = new HashMap <>();
7172
@@ -251,9 +252,10 @@ public void update(Collection<MemcachedNode> toAttach,
251252 */
252253 lock .lock ();
253254 try {
255+ ArrayList <MemcachedNode > newAllNodes = new ArrayList <>(allNodes );
254256 // Remove memcached nodes.
255257 for (MemcachedNode node : toDelete ) {
256- allNodes .remove (node );
258+ newAllNodes .remove (node );
257259 removeNodeFromGroup (node );
258260 try {
259261 node .closeChannel ();
@@ -269,7 +271,7 @@ public void update(Collection<MemcachedNode> toAttach,
269271
270272 // Add memcached nodes.
271273 for (MemcachedNode node : toAttach ) {
272- allNodes .add (node );
274+ newAllNodes .add (node );
273275 insertNodeIntoGroup (node );
274276 }
275277
@@ -280,6 +282,7 @@ public void update(Collection<MemcachedNode> toAttach,
280282 removeHash (group );
281283 }
282284 toDeleteGroups .clear ();
285+ allNodes = newAllNodes ;
283286 } finally {
284287 /* ENABLE_MIGRATION if */
285288 if (migrationInProgress && alterNodes .isEmpty ()) {
0 commit comments