Fix another VpnSubnetRouteHandler NPE source 09/85709/3
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 8 Nov 2019 11:42:52 +0000 (12:42 +0100)
committerStephen Kitt <skitt@redhat.com>
Wed, 13 Nov 2019 16:45:13 +0000 (16:45 +0000)
java.lang.NullPointerException: null
        at org.opendaylight.netvirt.vpnmanager.VpnSubnetRouteHandler.electNewDpnForSubnetRoute(VpnSubnetRouteHandler.java:988) ~[?:?]
        at org.opendaylight.netvirt.vpnmanager.VpnSubnetRouteHandler.onInterfaceDown(VpnSubnetRouteHandler.java:693) ~[?:?]
        at org.opendaylight.netvirt.vpnmanager.SubnetRouteInterfaceStateChangeListener.lambda$remove$1(SubnetRouteInterfaceStateChangeListener.java:184) ~[?:?]
        at org.opendaylight.infrautils.utils.ClassLoaders.lambda$call$2(ClassLoaders.java:39) ~[293:org.opendaylight.infrautils.util:1.6.1]
        at org.opendaylight.infrautils.utils.ClassLoaders.call(ClassLoaders.java:47) ~[293:org.opendaylight.infrautils.util:1.6.1]
        at org.opendaylight.infrautils.utils.ClassLoaders.call(ClassLoaders.java:39) ~[293:org.opendaylight.infrautils.util:1.6.1]
        at org.opendaylight.infrautils.jobcoordinator.internal.JobCoordinatorImpl$MainTask.runWithUncheckedExceptionLogging(JobCoordinatorImpl.java:398) ~[?:?]
        at org.opendaylight.infrautils.utils.concurrent.LoggingUncaughtThreadDeathContextRunnable.run(LoggingUncaughtThreadDeathContextRunnable.java:60) ~[293:org.opendaylight.infrautils.util:1.6.1]
        at org.opendaylight.infrautils.utils.ClassLoaders.lambda$run$0(ClassLoaders.java:26) ~[293:org.opendaylight.infrautils.util:1.6.1]
        at org.opendaylight.infrautils.utils.ClassLoaders.call(ClassLoaders.java:47) ~[293:org.opendaylight.infrautils.util:1.6.1]
        at org.opendaylight.infrautils.utils.ClassLoaders.run(ClassLoaders.java:25) ~[293:org.opendaylight.infrautils.util:1.6.1]
        at org.opendaylight.infrautils.utils.ClassLoaders.lambda$wrap$3(ClassLoaders.java:54) ~[293:org.opendaylight.infrautils.util:1.6.1]
        at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402) [?:?]
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) [?:?]
        at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) [?:?]
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) [?:?]
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) [?:?]

This indicates that we do not need to have entries on a downed
interface, thus fixing it up.

JIRA: NETVIRT-1636
Change-Id: I181a6b5f9f2618ff5be1bc254e5873f45f6f6768
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 6d7370b369d15affb039fc09664283817675966d)

vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java

index e0e6952442b262d35515154fa42e69cb0a4e74f3..a0eeedbbd5224b9f49e8f297f33ab89121d31fbb 100644 (file)
@@ -944,11 +944,7 @@ public class VpnSubnetRouteHandler {
     @SuppressWarnings("checkstyle:IllegalCatch")
     private void electNewDpnForSubnetRoute(SubnetOpDataEntryBuilder subOpBuilder, @Nullable Uint64 oldDpnId,
                                            Uuid subnetId, Uuid networkId, boolean isBgpVpn) {
-        List<SubnetToDpn> subDpnList = null;
         boolean isRouteAdvertised = false;
-        subDpnList = new ArrayList<>();
-        subDpnList = subOpBuilder.getSubnetToDpn() != null ? new ArrayList<>(subOpBuilder.getSubnetToDpn())
-                : subDpnList;
         String rd = subOpBuilder.getVrfId();
         String subnetIp = subOpBuilder.getSubnetCidr();
         String vpnName = subOpBuilder.getVpnName();
@@ -986,24 +982,27 @@ public class VpnSubnetRouteHandler {
 
         String nhTepIp = null;
         Uint64 nhDpnId = null;
-        for (SubnetToDpn subnetToDpn : subDpnList) {
-            if (subnetToDpn.getDpnId().equals(oldDpnId)) {
-                // Is this same is as input dpnId, then ignore it
-                continue;
-            }
-            nhDpnId = subnetToDpn.getDpnId();
-            if (vpnNodeListener.isConnectedNode(nhDpnId)) {
-                // selected dpnId is connected to ODL
-                // but does it have a TEP configured at all?
-                try {
-                    nhTepIp = InterfaceUtils.getEndpointIpAddressForDPN(dataBroker, nhDpnId);
-                    if (nhTepIp != null) {
-                        isAlternateDpnSelected = true;
-                        break;
+        List<SubnetToDpn> subDpnList = subOpBuilder.getSubnetToDpn();
+        if (subDpnList != null) {
+            for (SubnetToDpn subnetToDpn : subDpnList) {
+                if (subnetToDpn.getDpnId().equals(oldDpnId)) {
+                    // Is this same is as input dpnId, then ignore it
+                    continue;
+                }
+                nhDpnId = subnetToDpn.getDpnId();
+                if (vpnNodeListener.isConnectedNode(nhDpnId)) {
+                    // selected dpnId is connected to ODL
+                    // but does it have a TEP configured at all?
+                    try {
+                        nhTepIp = InterfaceUtils.getEndpointIpAddressForDPN(dataBroker, nhDpnId);
+                        if (nhTepIp != null) {
+                            isAlternateDpnSelected = true;
+                            break;
+                        }
+                    } catch (Exception e) {
+                        LOG.warn("{} electNewDpnForSubnetRoute: Unable to find TepIp for rd {} subnetroute subnetip {}"
+                                + " for dpnid {}, attempt next", LOGGING_PREFIX, rd, subnetIp, nhDpnId.toString(), e);
                     }
-                } catch (Exception e) {
-                    LOG.warn("{} electNewDpnForSubnetRoute: Unable to find TepIp for rd {} subnetroute subnetip {}"
-                            + " for dpnid {}, attempt next", LOGGING_PREFIX, rd, subnetIp, nhDpnId.toString(), e);
                 }
             }
         }