From: Apurba Mukherjee Date: Wed, 29 Jul 2020 14:11:46 +0000 (+0530) Subject: Fix: Internal tunnels missing after karaf restart in all 3 CICs X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=67f5118c86a112ac77a67a604f84f2f9bb4b0dc2;p=genius.git Fix: Internal tunnels missing after karaf restart in all 3 CICs NPE in DPNTEPsInfoCache due to CDTCN registration and invocation happened before DPNTEPsInfoCache constructor could finish initializing instance variables. Change-Id: Id80a9f6ec12d693332dc4cfcecbb9f4c0e39f7e6 Signed-off-by: Apurba Mukherjee --- diff --git a/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/cache/DPNTEPsInfoCache.java b/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/cache/DPNTEPsInfoCache.java index 9b025503f..9d33cd42b 100644 --- a/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/cache/DPNTEPsInfoCache.java +++ b/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/cache/DPNTEPsInfoCache.java @@ -25,6 +25,7 @@ import org.opendaylight.infrautils.caches.CacheProvider; import org.opendaylight.infrautils.jobcoordinator.JobCoordinator; import org.opendaylight.infrautils.utils.concurrent.NamedSimpleReentrantLock.Acquired; import org.opendaylight.mdsal.binding.api.DataBroker; +import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunner; import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunnerImpl; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; @@ -56,12 +57,14 @@ public class DPNTEPsInfoCache extends InstanceIdDataObjectCache { public DPNTEPsInfoCache(final DataBroker dataBroker, final CacheProvider cacheProvider, final DirectTunnelUtils directTunnelUtils, final JobCoordinator coordinator, final UnprocessedNodeConnectorEndPointCache unprocessedNodeConnectorEndPointCache) { - super(DPNTEPsInfo.class, dataBroker, LogicalDatastoreType.CONFIGURATION, - InstanceIdentifier.builder(DpnEndpoints.class).child(DPNTEPsInfo.class).build(), cacheProvider); + super(DPNTEPsInfo.class, dataBroker, LogicalDatastoreType.CONFIGURATION, cacheProvider); this.directTunnelUtils = directTunnelUtils; this.coordinator = coordinator; this.unprocessedNodeConnectorEndPointCache = unprocessedNodeConnectorEndPointCache; this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker); + listenerRegistration = dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create( + LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(DpnEndpoints.class) + .child(DPNTEPsInfo.class).build()), dataObjectListener); } @Override diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/cache/DataObjectCache.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/cache/DataObjectCache.java index d396f8e29..9997fa79d 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/cache/DataObjectCache.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/cache/DataObjectCache.java @@ -50,8 +50,9 @@ public class DataObjectCache implements AutoCloseable { private final SingleTransactionDataBroker broker; private final LoadingCache> cache; - private final ListenerRegistration listenerRegistration; private final AtomicBoolean isClosed = new AtomicBoolean(); + protected ListenerRegistration listenerRegistration; + protected ClusteredDataTreeChangeListener dataObjectListener; /** * Constructor. @@ -59,15 +60,23 @@ public class DataObjectCache implements AutoCloseable { * @param dataObjectClass the DataObject class to cache * @param dataBroker the DataBroker * @param datastoreType the LogicalDatastoreType - * @param listenerRegistrationPath the yang path for which register the listener * @param cacheProvider the CacheProvider used to instantiate the Cache * @param keyFunction the function used to convert or extract the key instance on change notification * @param instanceIdFunction the function used to convert a key instance to an InstanceIdentifier on read */ public DataObjectCache(Class dataObjectClass, DataBroker dataBroker, LogicalDatastoreType datastoreType, - InstanceIdentifier listenerRegistrationPath, CacheProvider cacheProvider, - BiFunction, V, K> keyFunction, - Function> instanceIdFunction) { + InstanceIdentifier listetenerRegistrationPath, CacheProvider cacheProvider, + BiFunction, V, K> keyFunction, + Function> instanceIdFunction) { + this(dataObjectClass, dataBroker, datastoreType, cacheProvider, keyFunction, instanceIdFunction); + listenerRegistration = dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create( + datastoreType, listetenerRegistrationPath), dataObjectListener); + + } + + public DataObjectCache(Class dataObjectClass, DataBroker dataBroker, LogicalDatastoreType datastoreType, + CacheProvider cacheProvider, BiFunction, V, K> keyFunction, + Function> instanceIdFunction) { Objects.requireNonNull(keyFunction); Objects.requireNonNull(instanceIdFunction); this.broker = new SingleTransactionDataBroker(Objects.requireNonNull(dataBroker)); @@ -80,7 +89,7 @@ public class DataObjectCache implements AutoCloseable { } }); - ClusteredDataTreeChangeListener dataObjectListener = changes -> { + dataObjectListener = changes -> { for (DataTreeModification dataTreeModification : changes) { DataObjectModification rootNode = dataTreeModification.getRootNode(); InstanceIdentifier path = dataTreeModification.getRootPath().getRootIdentifier(); @@ -101,16 +110,15 @@ public class DataObjectCache implements AutoCloseable { } } }; - - listenerRegistration = dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create( - datastoreType, listenerRegistrationPath), dataObjectListener); } @Override @PreDestroy public void close() { if (isClosed.compareAndSet(false, true)) { - listenerRegistration.close(); + if (listenerRegistration != null) { + listenerRegistration.close(); + } cache.cleanUp(); } else { LOG.warn("Lifecycled object already closed; ignoring extra close()"); diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/cache/InstanceIdDataObjectCache.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/cache/InstanceIdDataObjectCache.java index 3e1a7f992..e2692c91f 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/cache/InstanceIdDataObjectCache.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/cache/InstanceIdDataObjectCache.java @@ -25,4 +25,9 @@ public class InstanceIdDataObjectCache extends DataObjectC super(dataObjectClass, dataBroker, datastoreType, listenerRegistrationPath, cacheProvider, (iid, value) -> iid, iid -> iid); } + + public InstanceIdDataObjectCache(Class dataObjectClass, DataBroker dataBroker, + LogicalDatastoreType datastoreType, CacheProvider cacheProvider) { + super(dataObjectClass, dataBroker, datastoreType, cacheProvider, (iid, value) -> iid, iid -> iid); + } }