From acb96860f461827af712979c3a0c3f442075078d Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 1 Nov 2019 14:39:02 +0100 Subject: [PATCH] Fix VpnSubnetRouteHandler handling of getSubnetToDpn() List 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 --- .../vpnmanager/VpnSubnetRouteHandler.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java index 883b9d3f08..e0e6952442 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java @@ -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 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 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 concat(@Nullable List list, @NonNull SubnetToDpn entry) { + final List ret = new ArrayList<>(); + if (list != null) { + ret.addAll(list); + } + ret.add(entry); + return ret; + } } -- 2.36.6