Fix VpnSubnetRouteHandler handling of getSubnetToDpn() 88/85488/2
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 1 Nov 2019 13:39:02 +0000 (14:39 +0100)
committerFaseela K <k.faseela@gmail.com>
Mon, 4 Nov 2019 06:29:48 +0000 (06:29 +0000)
List<SubnetToDpn> may be null here:

java.lang.NullPointerException: null
        at org.opendaylight.netvirt.vpnmanager.VpnSubnetRouteHandler.onInterfaceUp(VpnSubnetRouteHandler.java:623) ~[?:?]
        at org.opendaylight.netvirt.vpnmanager.SubnetRouteInterfaceStateChangeListener.lambda$add$0(SubnetRouteInterfaceStateChangeListener.java:115) ~[?:?]
        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 patch fixes it up in a slighly different way to what
Magnesium did.

JIRA: NETVIRT-1636
Change-Id: Id075318b144ff34e680e16bfb426aaaa4fbe6af9
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java

index 883b9d3f0871b89482be2211904f51f5895ae9de..e0e6952442b262d35515154fa42e69cb0a4e74f3 100644 (file)
@@ -18,6 +18,7 @@ import java.util.Map;
 import java.util.Objects;
 import javax.inject.Inject;
 import javax.inject.Singleton;
+import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
@@ -482,9 +483,7 @@ public class VpnSubnetRouteHandler {
             }
             SubnetOpDataEntry subnetOpDataEntry = optionalSubs.get();
             SubnetOpDataEntryBuilder subOpBuilder = new SubnetOpDataEntryBuilder(subnetOpDataEntry);
-            List<SubnetToDpn> subDpnList = subOpBuilder.getSubnetToDpn();
-            subDpnList.add(subDpn);
-            subOpBuilder.setSubnetToDpn(subDpnList);
+            subOpBuilder.setSubnetToDpn(concat(subnetOpDataEntry.getSubnetToDpn(), subDpn));
             if (subOpBuilder.getRouteAdvState() != TaskState.Advertised) {
                 if (subOpBuilder.getNhDpnId() == null) {
                     // No nexthop selected yet, elect one now
@@ -620,11 +619,7 @@ public class VpnSubnetRouteHandler {
                     subOpBuilder.getRouteAdvState(), subOpBuilder.getLastAdvState());
             boolean isExternalSubnetVpn = VpnUtil.isExternalSubnetVpn(subnetOpDataEntry.getVpnName(),
                     subnetId.getValue());
-            List<SubnetToDpn> subDpnList = new ArrayList<>();
-            subDpnList = subOpBuilder.getSubnetToDpn() != null ? new ArrayList<>(subOpBuilder.getSubnetToDpn())
-                    : subDpnList;
-            subDpnList.add(subDpn);
-            subOpBuilder.setSubnetToDpn(subDpnList);
+            subOpBuilder.setSubnetToDpn(concat(subnetOpDataEntry.getSubnetToDpn(), subDpn));
             if (subOpBuilder.getRouteAdvState() != TaskState.Advertised) {
                 if (subOpBuilder.getNhDpnId() == null) {
                     // No nexthop selected yet, elect one now
@@ -1054,9 +1049,18 @@ public class VpnSubnetRouteHandler {
         }
     }
 
-    private boolean isRouteAdvertised(SubnetOpDataEntryBuilder subOpBuilder) {
+    private static boolean isRouteAdvertised(SubnetOpDataEntryBuilder subOpBuilder) {
         return subOpBuilder.getRouteAdvState() == TaskState.Advertised
                 || subOpBuilder.getRouteAdvState() == TaskState.PendingAdvertise;
     }
+
+    private static @NonNull List<SubnetToDpn> concat(@Nullable List<SubnetToDpn> list, @NonNull SubnetToDpn entry) {
+        final List<SubnetToDpn> ret = new ArrayList<>();
+        if (list != null) {
+            ret.addAll(list);
+        }
+        ret.add(entry);
+        return ret;
+    }
 }