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 <tadei.bilan@pantheon.tech>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit
282fd5f43263464180a2ecc806c0eb333f0f2c5c)
package org.opendaylight.controller.cluster.datastore;
import com.google.common.annotations.VisibleForTesting;
package org.opendaylight.controller.cluster.datastore;
import com.google.common.annotations.VisibleForTesting;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
abstract class AbstractDatastoreContextIntrospectorFactory implements DatastoreContextIntrospectorFactory {
@Override
abstract class AbstractDatastoreContextIntrospectorFactory implements DatastoreContextIntrospectorFactory {
@Override
- public final DatastoreContextIntrospector newInstance(final LogicalDatastoreType datastoreType) {
+ public DatastoreContextIntrospector newInstance(final LogicalDatastoreType datastoreType,
+ final Map<String, Object> 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")
return newInstance(DatastoreContext.newBuilder()
.logicalStoreType(datastoreType)
.tempFileDirectory("./data")
*/
package org.opendaylight.controller.cluster.datastore;
*/
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;
/**
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
/**
- * Factory for creating DatastoreContextIntrospector instances.
+ * Factory for creating {@link DatastoreContextIntrospector} instances.
*
* @author Thomas Pantelis
*/
*
* @author Thomas Pantelis
*/
public interface DatastoreContextIntrospectorFactory {
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<String, Object> properties);
synchronized void updateProperties(final Map<String, Object> properties) {
if (introspector.update(properties)) {
synchronized void updateProperties(final Map<String, Object> properties) {
if (introspector.update(properties)) {
+ LOG.info("Distributed Datastore type {} updating context", datastoreType);
datastore.onDatastoreContextUpdated(introspector.newContextFactory());
}
}
datastore.onDatastoreContextUpdated(introspector.newContextFactory());
}
}
@Activate
void activate(final Map<String, Object> properties) {
@Activate
void activate(final Map<String, Object> 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));
new ConfigurationImpl(configProvider));
}
private DatastoreState createDatastore(final LogicalDatastoreType datastoreType, final String serviceType,
}
private DatastoreState createDatastore(final LogicalDatastoreType datastoreType, final String serviceType,
- final Configuration config) {
+ final Map<String, Object> properties, final Configuration config) {
LOG.info("Distributed Datastore type {} starting", datastoreType);
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));
final AbstractDataStore datastore = DistributedDataStoreFactory.createInstance(actorSystemProvider,
introspector.getContext(), introspector, snapshotRestore, config);
datastore.setCloseable(schemaService.registerSchemaContextListener(datastore));