From 663fca27e95e9923735b60cf38b4f90357d2b5ce Mon Sep 17 00:00:00 2001 From: "tadei.bilan" Date: Fri, 6 Nov 2020 16:47:25 +0200 Subject: [PATCH] Fix initial datastore configuration Shards need to be initialized with initial configuration upon creation, otherwise they end up being reconfigured. Make sure callers are aware of this caveat by requiring explicit properties on instantiation. JIRA: CONTROLLER-1970 Change-Id: I3d6f96780d26435ac178ec9935f0f67befe3687a Signed-off-by: tadei.bilan Signed-off-by: Robert Varga (cherry picked from commit 282fd5f43263464180a2ecc806c0eb333f0f2c5c) --- ...ractDatastoreContextIntrospectorFactory.java | 11 ++++++++++- .../DatastoreContextIntrospectorFactory.java | 17 ++++++++++++++--- .../datastore/OSGiDistributedDataStore.java | 10 +++++----- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractDatastoreContextIntrospectorFactory.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractDatastoreContextIntrospectorFactory.java index c4d9c4da99..4aa075f3d3 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractDatastoreContextIntrospectorFactory.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractDatastoreContextIntrospectorFactory.java @@ -8,6 +8,7 @@ package org.opendaylight.controller.cluster.datastore; import com.google.common.annotations.VisibleForTesting; +import java.util.Map; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; @@ -17,7 +18,15 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; abstract class AbstractDatastoreContextIntrospectorFactory implements DatastoreContextIntrospectorFactory { @Override - public final DatastoreContextIntrospector newInstance(final LogicalDatastoreType datastoreType) { + public DatastoreContextIntrospector newInstance(final LogicalDatastoreType datastoreType, + final Map properties) { + final DatastoreContextIntrospector inst = newInstance(datastoreType); + inst.update(properties); + return inst; + } + + @VisibleForTesting + final DatastoreContextIntrospector newInstance(final LogicalDatastoreType datastoreType) { return newInstance(DatastoreContext.newBuilder() .logicalStoreType(datastoreType) .tempFileDirectory("./data") diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DatastoreContextIntrospectorFactory.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DatastoreContextIntrospectorFactory.java index 8d2b7e7391..1bc5e9dac4 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DatastoreContextIntrospectorFactory.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DatastoreContextIntrospectorFactory.java @@ -7,14 +7,25 @@ */ package org.opendaylight.controller.cluster.datastore; -import org.eclipse.jdt.annotation.NonNull; +import java.util.Map; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; /** - * Factory for creating DatastoreContextIntrospector instances. + * Factory for creating {@link DatastoreContextIntrospector} instances. * * @author Thomas Pantelis */ +@NonNullByDefault public interface DatastoreContextIntrospectorFactory { - @NonNull DatastoreContextIntrospector newInstance(LogicalDatastoreType datastoreType); + /** + * Create a new {@link DatastoreContextIntrospector} initialized with specified properties. + * + * @param datastoreType Datastore type + * @param properties optional initial properties + * @return A new DatastoreContextIntrospector + */ + DatastoreContextIntrospector newInstance(LogicalDatastoreType datastoreType, + @Nullable Map properties); } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/OSGiDistributedDataStore.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/OSGiDistributedDataStore.java index cfcffbfd48..1480643e0b 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/OSGiDistributedDataStore.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/OSGiDistributedDataStore.java @@ -67,6 +67,7 @@ public final class OSGiDistributedDataStore { synchronized void updateProperties(final Map properties) { if (introspector.update(properties)) { + LOG.info("Distributed Datastore type {} updating context", datastoreType); datastore.onDatastoreContextUpdated(introspector.newContextFactory()); } } @@ -128,10 +129,9 @@ public final class OSGiDistributedDataStore { @Activate void activate(final Map properties) { - configDatastore = createDatastore(LogicalDatastoreType.CONFIGURATION, "distributed-config", null); - operDatastore = createDatastore(LogicalDatastoreType.OPERATIONAL, "distributed-operational", + configDatastore = createDatastore(LogicalDatastoreType.CONFIGURATION, "distributed-config", properties, null); + operDatastore = createDatastore(LogicalDatastoreType.OPERATIONAL, "distributed-operational", properties, new ConfigurationImpl(configProvider)); - modified(properties); } @Modified @@ -150,9 +150,9 @@ public final class OSGiDistributedDataStore { } private DatastoreState createDatastore(final LogicalDatastoreType datastoreType, final String serviceType, - final Configuration config) { + final Map properties, final Configuration config) { LOG.info("Distributed Datastore type {} starting", datastoreType); - final DatastoreContextIntrospector introspector = introspectorFactory.newInstance(datastoreType); + final DatastoreContextIntrospector introspector = introspectorFactory.newInstance(datastoreType, properties); final AbstractDataStore datastore = DistributedDataStoreFactory.createInstance(actorSystemProvider, introspector.getContext(), introspector, snapshotRestore, config); datastore.setCloseable(schemaService.registerSchemaContextListener(datastore)); -- 2.36.6