Merge "Add CSR1Kv configs"
authorVina Ermagan <vermagan@cisco.com>
Tue, 16 May 2017 18:29:04 +0000 (18:29 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 16 May 2017 18:29:04 +0000 (18:29 +0000)
integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/MultiSiteScenario.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/lisp/MapResolver.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/lisp/MapServer.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/mdsal/MappingDataListener.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/util/LoggingUtil.java [new file with mode: 0644]

index 3b15d204ab5e5fa33ab3fccb7c5eaeddcb2bb76a..bde37275f61f086d4730ef4541b28f060ad5c15d 100644 (file)
@@ -443,6 +443,10 @@ class MultiSiteScenario {
     private List<MapRequest> translateBuffersToMapRequest(byte[][] buffers) {
         final List<MapRequest> mapRequests = new ArrayList<>();
         for (byte[] buffer : buffers) {
+            if (isBufferEmpty(buffer)) {
+                LOG.error("Empty buffer while translating Map-Request");
+                continue;
+            }
             final MapRequest mapRequest = MapRequestSerializer.getInstance().deserialize(ByteBuffer.wrap(buffer), null);
             assertNotNull(mapRequest);
             mapRequests.add(mapRequest);
@@ -472,9 +476,14 @@ class MultiSiteScenario {
             fail("No SMR received!");
         }
         List<MapRequest> mapRequests = translateBuffersToMapRequest(buffers);
+        if (hosts.length != mapRequests.size()) {
+            LOG.error("Expected {} SMRs, received {}", hosts.length, mapRequests.size());
+            fail("Unexpected number of SMRs received");
+        }
         final Set<Eid> eids = prepareExpectedEid(hosts);
         final SourceEid expectedSourceEid = prepareSourceEid(site);
         for(MapRequest mapRequest : mapRequests) {
+            LOG.trace("Map-Request: {}", mapRequest);
             assertTrue(mapRequest.isSmr());
             final SourceEid receivedSourceEid = mapRequest.getSourceEid();
             assertEquals(expectedSourceEid, receivedSourceEid);
@@ -497,12 +506,19 @@ class MultiSiteScenario {
         return true;
     }
 
+    private static boolean isBufferEmpty(byte[] buffer) {
+        for (byte b : buffer) {
+            if (b != 0) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     protected static boolean areBuffersEmpty(byte[][] buffers) {
         for (byte[] buffer : buffers) {
-            for (byte b : buffer) {
-                if (b != 0) {
-                    return false;
-                }
+            if (!isBufferEmpty(buffer)) {
+                return false;
             }
         }
         return true;
index 1be9e16b5191f69ed27840c1691c78537ee178f1..c74b69fefaa4a0ccd5226b76facae20ddefd9424 100644 (file)
@@ -198,7 +198,10 @@ public class MapResolver implements IMapResolverAsync {
             subscribers.remove(subscriber);
         }
         if (LOG.isTraceEnabled()) {
-            LOG.trace("Adding new subscriber: " + LispAddressStringifier.getString(subscriber.getSrcRloc()));
+            LOG.trace("Adding new subscriber {} for EID {}, source EID {}",
+                    LispAddressStringifier.getString(subscriber.getSrcRloc()),
+                    LispAddressStringifier.getString(subscribedEid),
+                    LispAddressStringifier.getString(subscriber.getSrcEid()));
         }
         subscribers.add(subscriber);
         addSubscribers(subscribedEid, subscribers);
index 83f0602b3aba335b3f2f9a07ae44c504409f995b..ed5427d7c05664ba61c390ccd77a7bfaccc3825c 100644 (file)
@@ -31,6 +31,7 @@ import java.util.concurrent.TimeUnit;
 import org.apache.commons.lang3.BooleanUtils;
 import org.opendaylight.controller.md.sal.binding.api.NotificationService;
 import org.opendaylight.lispflowmapping.config.ConfigIni;
+import org.opendaylight.lispflowmapping.implementation.util.LoggingUtil;
 import org.opendaylight.lispflowmapping.implementation.util.MSNotificationInputUtil;
 import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
 import org.opendaylight.lispflowmapping.interfaces.dao.Subscriber;
@@ -48,7 +49,6 @@ import org.opendaylight.lispflowmapping.lisp.util.MapNotifyBuilderHelper;
 import org.opendaylight.lispflowmapping.lisp.util.MapRequestUtil;
 import org.opendaylight.lispflowmapping.lisp.util.MappingRecordUtil;
 import org.opendaylight.lispflowmapping.lisp.util.SourceDestKeyHelper;
-import org.opendaylight.lispflowmapping.mapcache.lisp.LispMapCacheStringifier;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.IpAddressBinary;
@@ -145,9 +145,11 @@ public class MapServer implements IMapServerAsync, OdlMappingserviceListener, IS
                     if (oldMapping != null && !oldMapping.getEid().equals(eid)) {
                         subscribers = addParentSubscribers(eid, subscribers);
                     }
+                    LoggingUtil.logSubscribers(LOG, eid, subscribers);
                     handleSmr(eid, subscribers);
                     if (oldMapping != null && oldMappingRemoved && !oldMapping.getEid().equals(eid)) {
                         subscribers = getSubscribers(oldMapping.getEid());
+                        LoggingUtil.logSubscribers(LOG, oldMapping.getEid(), subscribers);
                         handleSmr(oldMapping.getEid(), subscribers);
                     }
                     mappingUpdated = true;
@@ -214,17 +216,17 @@ public class MapServer implements IMapServerAsync, OdlMappingserviceListener, IS
 
     @Override
     public void onMappingChanged(MappingChanged notification) {
-        LOG.trace("MappingChanged event of type {}", notification.getChangeType());
+        LOG.trace("MappingChanged event of type: `{}'", notification.getChangeType());
         if (subscriptionService) {
             Eid eid = notification.getMappingRecord().getEid();
             Set<Subscriber> subscribers = MSNotificationInputUtil.toSubscriberSet(notification.getSubscriberItem());
-            LOG.trace("Subscribers:\n{}", LispMapCacheStringifier.prettyPrintSubscriberSet(subscribers, 0));
+            LoggingUtil.logSubscribers(LOG, eid, subscribers);
             if (mapService.isMaster()) {
                 sendSmrs(eid, subscribers);
                 if (eid.getAddress() instanceof SourceDestKey) {
                     Set<Subscriber> dstSubscribers = MSNotificationInputUtil.toSubscriberSetFromDst(
                             notification.getDstSubscriberItem());
-                    LOG.trace("DstSubscribers:\n{}", LispMapCacheStringifier.prettyPrintSubscriberSet(subscribers, 0));
+                    LoggingUtil.logSubscribers(LOG, SourceDestKeyHelper.getDstBinary(eid), dstSubscribers);
                     sendSmrs(SourceDestKeyHelper.getDstBinary(eid), dstSubscribers);
                 }
             }
@@ -309,7 +311,7 @@ public class MapServer implements IMapServerAsync, OdlMappingserviceListener, IS
             Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
             while (interfaces.hasMoreElements()) {
                 NetworkInterface current = interfaces.nextElement();
-                LOG.debug("Interface " + current.toString());
+                LOG.trace("Interface " + current.toString());
                 if (!current.isUp() || current.isLoopback() || current.isVirtual()) {
                     continue;
                 }
@@ -356,16 +358,17 @@ 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);
                     final IpAddressBinary subscriberAddress = LispAddressUtil
                             .addressBinaryFromAddress(subscriber.getSrcRloc().getAddress());
 
                     if (subscriberFutureMap.containsKey(subscriberAddress)) {
-                        subscriberFutureMap.get(subscriberAddress).put(mrb.getSourceEid().getEid(), future);
+                        subscriberFutureMap.get(subscriberAddress).put(srcEid, future);
                     } else {
                         final Map<Eid, ScheduledFuture<?>> eidFutureMap = Maps.newConcurrentMap();
-                        eidFutureMap.put(mrb.getSourceEid().getEid(), future);
+                        eidFutureMap.put(srcEid, future);
                         subscriberFutureMap.put(subscriberAddress, eidFutureMap);
                     }
                 }
@@ -379,9 +382,10 @@ public class MapServer implements IMapServerAsync, OdlMappingserviceListener, IS
                 if (eidFutureMap != null) {
                     final ScheduledFuture<?> future = eidFutureMap.get(event.getEid());
                     if (future != null && !future.isCancelled()) {
-                        future.cancel(false);
-                        LOG.debug("SMR-invoked MapRequest received, scheduled task for subscriber {} with nonce {} has "
-                                + "been canceled", subscriberAddress.toString(), event.getNonce());
+                        future.cancel(true);
+                        LOG.debug("SMR-invoked MapRequest received, scheduled task for subscriber {}, EID {} with"
+                                + " nonce {} has been cancelled", subscriberAddress.toString(),
+                                LispAddressStringifier.getString(event.getEid()), event.getNonce());
                         eidFutureMap.remove(event.getEid());
                     }
                     if (eidFutureMap.isEmpty()) {
@@ -406,39 +410,51 @@ public class MapServer implements IMapServerAsync, OdlMappingserviceListener, IS
             public void run() {
                 final IpAddressBinary subscriberAddress = LispAddressUtil
                         .addressBinaryFromAddress(subscriber.getSrcRloc().getAddress());
+                final Eid srcEid = mrb.getSourceEid().getEid();
+
                 try {
                     // The address stored in the SMR's EID record is used as Source EID in the SMR-invoked
                     // Map-Request. To ensure consistent behavior it is set to the value used to originally request
                     // a given mapping.
                     if (executionCount <= ConfigIni.getInstance().getSmrRetryCount()) {
-                        mrb.setEidItem(new ArrayList<EidItem>());
-                        mrb.getEidItem().add(new EidItemBuilder().setEid(subscriber.getSrcEid()).build());
-                        notifyHandler.handleSMR(mrb.build(), subscriber.getSrcRloc());
-                        LOG.trace("{}. attempt to send SMR for MapRequest " + mrb.getSourceEid().getEid()
-                                + " to subscriber " + subscriber.getSrcRloc(), executionCount);
+                        synchronized (mrb) {
+                            mrb.setEidItem(new ArrayList<EidItem>());
+                            mrb.getEidItem().add(new EidItemBuilder().setEid(subscriber.getSrcEid()).build());
+                            notifyHandler.handleSMR(mrb.build(), subscriber.getSrcRloc());
+                            if (LOG.isTraceEnabled()) {
+                                LOG.trace("Attempt #{} to send SMR for EID {} to subscriber {}, source EID {}",
+                                        executionCount,
+                                        LispAddressStringifier.getString(mrb.getSourceEid().getEid()),
+                                        LispAddressStringifier.getString(subscriber.getSrcRloc()),
+                                        LispAddressStringifier.getString(mrb.getEidItem().get(0).getEid()));
+                            }
+                        }
                     } else {
                         LOG.trace("Cancelling execution of a SMR Map-Request after {} failed attempts.",
                                 executionCount - 1);
-                        cancelAndRemove(subscriberAddress);
+                        cancelAndRemove(subscriberAddress, srcEid);
+                        return;
                     }
                 } catch (Exception e) {
                     LOG.error("Errors encountered while handling SMR:", e);
-                    cancelAndRemove(subscriberAddress);
+                    cancelAndRemove(subscriberAddress, srcEid);
+                    return;
                 }
                 executionCount++;
             }
 
-            private void cancelAndRemove(IpAddressBinary subscriberAddress) {
+            private void cancelAndRemove(IpAddressBinary subscriberAddress, Eid eid) {
                 final Map<Eid, ScheduledFuture<?>> eidFutureMap = subscriberFutureMap.get(subscriberAddress);
                 if (eidFutureMap == null) {
                     LOG.warn("Couldn't find subscriber {} in SMR scheduler internal list", subscriberAddress);
                     return;
                 }
-                final Eid eid = mrb.getSourceEid().getEid();
+
                 if (eidFutureMap.containsKey(eid)) {
-                    eidFutureMap.get(eid).cancel(false);
+                    ScheduledFuture<?> eidFuture = eidFutureMap.get(eid);
+                    eidFutureMap.remove(eid);
+                    eidFuture.cancel(false);
                 }
-                eidFutureMap.remove(eid);
                 if (eidFutureMap.isEmpty()) {
                     subscriberFutureMap.remove(subscriberAddress);
                 }
index aedf49deae54bdaf2e8327e5fa837b5cf99745f6..fdca1eac6792aaa9e7203198124e83b76b1f1ba7 100644 (file)
@@ -16,6 +16,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
+import org.opendaylight.lispflowmapping.implementation.util.LoggingUtil;
 import org.opendaylight.lispflowmapping.implementation.util.MSNotificationInputUtil;
 import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
 import org.opendaylight.lispflowmapping.interfaces.dao.Subscriber;
@@ -124,12 +125,15 @@ public class MappingDataListener extends AbstractDataListener<Mapping> {
                         new MappingData(convertedMapping.getMappingRecord()));
                 Set<Subscriber> subscribers = (Set<Subscriber>) mapSystem.getData(MappingOrigin.Southbound,
                         convertedEid, SubKeys.SUBSCRIBERS);
+                LoggingUtil.logSubscribers(LOG, convertedEid, subscribers);
+
                 Set<Subscriber> dstSubscribers = null;
                 // For SrcDst LCAF also send SMRs to Dst prefix
                 if (convertedEid.getAddress() instanceof SourceDestKey) {
                     Eid dstAddr = SourceDestKeyHelper.getDstBinary(convertedEid);
                     dstSubscribers = (Set<Subscriber>) mapSystem.getData(MappingOrigin.Southbound,
                             dstAddr, SubKeys.SUBSCRIBERS);
+                    LoggingUtil.logSubscribers(LOG, dstAddr, dstSubscribers);
                 }
 
                 try {
diff --git a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/util/LoggingUtil.java b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/util/LoggingUtil.java
new file mode 100644 (file)
index 0000000..f8b09cf
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2017 Cisco Systems, Inc.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.lispflowmapping.implementation.util;
+
+import java.util.Set;
+import org.opendaylight.lispflowmapping.interfaces.dao.Subscriber;
+import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
+import org.opendaylight.lispflowmapping.mapcache.lisp.LispMapCacheStringifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
+import org.slf4j.Logger;
+
+/**
+ * Static utility methods for common logging patterns.
+ *
+ * @author Lorand Jakab
+ *
+ */
+public class LoggingUtil {
+    // Utility class, should not be instantiated
+    private LoggingUtil() {
+    }
+
+    public static void logSubscribers(Logger log, Eid eid, Set<Subscriber> subscribers) {
+        if (log.isTraceEnabled()) {
+            log.trace("Subscribers for EID {}\n{}",
+                    LispAddressStringifier.getString(eid),
+                    LispMapCacheStringifier.prettyPrintSubscriberSet(subscribers, 0));
+        }
+    }
+}