Bug 5705: Fix removing a subscriber from an Iterator 72/37472/2
authorMiroslav Toth <mirtoth@cisco.com>
Tue, 12 Apr 2016 08:18:52 +0000 (10:18 +0200)
committerMiroslav Toth <mirtoth@cisco.com>
Tue, 12 Apr 2016 08:39:28 +0000 (10:39 +0200)
Change-Id: I3e2976d3aeeeafd947507f2123cdb7f45a70851d
Signed-off-by: Miroslav Toth <mirtoth@cisco.com>
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/lisp/MapServer.java

index 45c61431777a09127c106999e38c43ed3caba8d5..313d7a89b6070919ad9edbdde8de79270298ecce 100644 (file)
@@ -14,6 +14,7 @@ import java.net.SocketException;
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
@@ -237,10 +238,14 @@ public class MapServer implements IMapServerAsync, OdlMappingserviceListener {
         }
         MapRequestBuilder mrb = MapRequestUtil.prepareSMR(eid, LispAddressUtil.toRloc(getLocalAddress()));
         LOG.trace("Built SMR packet: " + mrb.build().toString());
-        for (SubscriberRLOC subscriber : subscribers) {
+        // Using Iterator ensures that we don't get a ConcurrentModificationException when removing a SubscriberRLOC
+        // from a Set.
+        Iterator<SubscriberRLOC> iterator = subscribers.iterator();
+        while (iterator.hasNext()) {
+            SubscriberRLOC subscriber = iterator.next();
             if (subscriber.timedOut()) {
                 LOG.trace("Lazy removing expired subscriber entry " + subscriber.toString());
-                subscribers.remove(subscriber);
+                iterator.remove();
             } else {
                 try {
                     // The address stored in the SMR's EID record is used as Source EID in the SMR-invoked Map-Request.