Reverse SmrScheduler Map order Subscriber <--> Eid 86/57786/3
authorLorand Jakab <lojakab@cisco.com>
Wed, 24 May 2017 17:19:57 +0000 (20:19 +0300)
committerLorand Jakab <lojakab@cisco.com>
Thu, 25 May 2017 08:02:00 +0000 (11:02 +0300)
Change-Id: Ic4b5614c2825f0e03b637896fae5b93f21bdbe32
Signed-off-by: Lorand Jakab <lojakab@cisco.com>
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/lisp/MapServer.java

index 1d98688c91da93ff8e77aa73888fdda9877ce5d8..2663c292de2caeb5540903233025d58580680aff 100644 (file)
@@ -347,9 +347,12 @@ public class MapServer implements IMapServerAsync, OdlMappingserviceListener, IS
         private final ThreadFactory threadFactory = new ThreadFactoryBuilder()
                 .setNameFormat("smr-executor-%d").build();
         private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(cpuCores * 2, threadFactory);
-        private final Map<Subscriber, Map<Eid, ScheduledFuture<?>>> subscriberFutureMap = Maps.newConcurrentMap();
+        private final Map<Eid, Map<Subscriber, ScheduledFuture<?>>> eidFutureMap = Maps.newConcurrentMap();
 
         void scheduleSmrs(MapRequestBuilder mrb, Iterator<Subscriber> subscribers) {
+            final Eid srcEid = mrb.getSourceEid().getEid();
+            final Map<Subscriber, ScheduledFuture<?>> subscriberFutureMap = Maps.newConcurrentMap();
+
             // Using Iterator ensures that we don't get a ConcurrentModificationException when removing a Subscriber
             // from a Set.
             while (subscribers.hasNext()) {
@@ -358,19 +361,16 @@ public class MapServer implements IMapServerAsync, OdlMappingserviceListener, IS
                     LOG.debug("Lazy removing expired subscriber entry " + subscriber.getString());
                     subscribers.remove();
                 } else {
-                    final Eid srcEid = mrb.getSourceEid().getEid();
                     final ScheduledFuture<?> future = executor.scheduleAtFixedRate(new CancellableRunnable(
                             mrb, subscriber), 0L, ConfigIni.getInstance().getSmrTimeout(), TimeUnit.MILLISECONDS);
-
-                    if (subscriberFutureMap.containsKey(subscriber)) {
-                        subscriberFutureMap.get(subscriber).put(srcEid, future);
-                    } else {
-                        final Map<Eid, ScheduledFuture<?>> eidFutureMap = Maps.newConcurrentMap();
-                        eidFutureMap.put(srcEid, future);
-                        subscriberFutureMap.put(subscriber, eidFutureMap);
-                    }
+                    subscriberFutureMap.put(subscriber, future);
                 }
             }
+
+            if (subscriberFutureMap.isEmpty()) {
+                return;
+            }
+            eidFutureMap.put(srcEid, subscriberFutureMap);
         }
 
         void smrReceived(SmrEvent event) {
@@ -378,19 +378,19 @@ public class MapServer implements IMapServerAsync, OdlMappingserviceListener, IS
             for (Subscriber subscriber : subscriberList) {
                 LOG.trace("SMR-invoked event, EID {}, subscriber {}", LispAddressStringifier.getString(event.getEid()),
                         subscriber.getString());
-                final Map<Eid, ScheduledFuture<?>> eidFutureMap = subscriberFutureMap.get(subscriber);
-                if (eidFutureMap != null) {
-                    final ScheduledFuture<?> future = eidFutureMap.get(event.getEid());
+                final Map<Subscriber, ScheduledFuture<?>> subscriberFutureMap = eidFutureMap.get(event.getEid());
+                if (subscriberFutureMap != null) {
+                    final ScheduledFuture<?> future = subscriberFutureMap.get(subscriber);
                     if (future != null && !future.isCancelled()) {
                         future.cancel(true);
                         LOG.debug("SMR-invoked MapRequest received, scheduled task for subscriber {}, EID {} with"
                                 + " nonce {} has been cancelled", subscriber.getString(),
                                 LispAddressStringifier.getString(event.getEid()), event.getNonce());
-                        eidFutureMap.remove(event.getEid());
-                    }
-                    if (eidFutureMap.isEmpty()) {
                         subscriberFutureMap.remove(subscriber);
                     }
+                    if (subscriberFutureMap.isEmpty()) {
+                        eidFutureMap.remove(event.getEid());
+                    }
                 }
             }
         }
@@ -441,19 +441,19 @@ public class MapServer implements IMapServerAsync, OdlMappingserviceListener, IS
             }
 
             private void cancelAndRemove(Subscriber subscriber, Eid eid) {
-                final Map<Eid, ScheduledFuture<?>> eidFutureMap = subscriberFutureMap.get(subscriber);
-                if (eidFutureMap == null) {
+                final Map<Subscriber, ScheduledFuture<?>> subscriberFutureMap = eidFutureMap.get(eid);
+                if (subscriberFutureMap == null) {
                     LOG.warn("Couldn't find subscriber {} in SMR scheduler internal list", subscriber);
                     return;
                 }
 
-                if (eidFutureMap.containsKey(eid)) {
-                    ScheduledFuture<?> eidFuture = eidFutureMap.get(eid);
-                    eidFutureMap.remove(eid);
+                if (subscriberFutureMap.containsKey(subscriber)) {
+                    ScheduledFuture<?> eidFuture = subscriberFutureMap.get(subscriber);
+                    subscriberFutureMap.remove(subscriber);
                     eidFuture.cancel(false);
                 }
-                if (eidFutureMap.isEmpty()) {
-                    subscriberFutureMap.remove(subscriber);
+                if (subscriberFutureMap.isEmpty()) {
+                    eidFutureMap.remove(eid);
                 }
             }
         }