From 00ceab3367dcacf1e39d84a977301fc7b81118dd Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 23 Jan 2015 11:31:14 +0100 Subject: [PATCH] Clarify DistributedDataStoreFactory DistributedDataStoreFactory used an atomic reference to manage a lazy initialization of a singleton, which could fail to initialize. Use an explicit volatile and lower synchronization requirements when the singleton has already been initialized. Change-Id: I10c38ca2441c6e7d8251560f9ea1218211490fc9 Signed-off-by: Robert Varga --- .../DistributedDataStoreFactory.java | 48 ++++++++----------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreFactory.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreFactory.java index 004faf2de1..5d63c92e88 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreFactory.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreFactory.java @@ -5,7 +5,6 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.controller.cluster.datastore; import akka.actor.ActorSystem; @@ -17,15 +16,11 @@ import org.opendaylight.controller.cluster.datastore.shardstrategy.ShardStrategy import org.opendaylight.controller.sal.core.api.model.SchemaService; import org.osgi.framework.BundleContext; -import java.util.concurrent.atomic.AtomicReference; - public class DistributedDataStoreFactory { + private static final String ACTOR_SYSTEM_NAME = "opendaylight-cluster-data"; + private static final String CONFIGURATION_NAME = "odl-cluster-data"; - public static final String ACTOR_SYSTEM_NAME = "opendaylight-cluster-data"; - - public static final String CONFIGURATION_NAME = "odl-cluster-data"; - - private static AtomicReference persistentActorSystem = new AtomicReference<>(); + private static volatile ActorSystem persistentActorSystem = null; public static DistributedDataStore createInstance(String name, SchemaService schemaService, DatastoreContext datastoreContext, BundleContext bundleContext) { @@ -41,26 +36,25 @@ public class DistributedDataStoreFactory { return dataStore; } - synchronized private static final ActorSystem getOrCreateInstance(final BundleContext bundleContext, ConfigurationReader configurationReader) { - - AtomicReference actorSystemReference = persistentActorSystem; - String configurationName = CONFIGURATION_NAME; - String actorSystemName = ACTOR_SYSTEM_NAME; - - if (actorSystemReference.get() != null){ - return actorSystemReference.get(); + private static final ActorSystem getOrCreateInstance(final BundleContext bundleContext, ConfigurationReader configurationReader) { + ActorSystem ret = persistentActorSystem; + if (ret == null) { + synchronized (DistributedDataStoreFactory.class) { + ret = persistentActorSystem; + if (ret == null) { + // Create an OSGi bundle classloader for actor system + BundleDelegatingClassLoader classLoader = new BundleDelegatingClassLoader(bundleContext.getBundle(), + Thread.currentThread().getContextClassLoader()); + + ret = ActorSystem.create(ACTOR_SYSTEM_NAME, + ConfigFactory.load(configurationReader.read()).getConfig(CONFIGURATION_NAME), classLoader); + ret.actorOf(Props.create(TerminationMonitor.class), "termination-monitor"); + + persistentActorSystem = ret; + } + } } - // Create an OSGi bundle classloader for actor system - BundleDelegatingClassLoader classLoader = new BundleDelegatingClassLoader(bundleContext.getBundle(), - Thread.currentThread().getContextClassLoader()); - - ActorSystem system = ActorSystem.create(actorSystemName, - ConfigFactory.load(configurationReader.read()).getConfig(configurationName), classLoader); - system.actorOf(Props.create(TerminationMonitor.class), "termination-monitor"); - - actorSystemReference.set(system); - return system; + return ret; } - } -- 2.36.6