BUG 2134 : Make persistence configurable at the datastore level
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / DistributedDataStoreFactory.java
index f19cb9284cf3ecd81cbe2672c731db3d80af0d3a..004faf2de1a42b833877a16efdac1f35ef9c086f 100644 (file)
@@ -8,15 +8,59 @@
 
 package org.opendaylight.controller.cluster.datastore;
 
+import akka.actor.ActorSystem;
+import akka.actor.Props;
+import akka.osgi.BundleDelegatingClassLoader;
+import com.typesafe.config.ConfigFactory;
+import org.opendaylight.controller.cluster.datastore.config.ConfigurationReader;
+import org.opendaylight.controller.cluster.datastore.shardstrategy.ShardStrategyFactory;
 import org.opendaylight.controller.sal.core.api.model.SchemaService;
+import org.osgi.framework.BundleContext;
+
+import java.util.concurrent.atomic.AtomicReference;
 
 public class DistributedDataStoreFactory {
-    public static DistributedDataStore createInstance(String name, SchemaService schemaService){
+
+    public static final String ACTOR_SYSTEM_NAME = "opendaylight-cluster-data";
+
+    public static final String CONFIGURATION_NAME = "odl-cluster-data";
+
+    private static AtomicReference<ActorSystem> persistentActorSystem = new AtomicReference<>();
+
+    public static DistributedDataStore createInstance(String name, SchemaService schemaService,
+                                                      DatastoreContext datastoreContext, BundleContext bundleContext) {
+
+        ActorSystem actorSystem = getOrCreateInstance(bundleContext, datastoreContext.getConfigurationReader());
+        Configuration config = new ConfigurationImpl("module-shards.conf", "modules.conf");
         final DistributedDataStore dataStore =
-            new DistributedDataStore(ActorSystemFactory.getInstance(), name);
-        schemaService
-            .registerSchemaServiceListener(dataStore);
+                new DistributedDataStore(actorSystem, name, new ClusterWrapperImpl(actorSystem),
+                        config, datastoreContext);
+
+        ShardStrategyFactory.setConfiguration(config);
+        schemaService.registerSchemaContextListener(dataStore);
         return dataStore;
+    }
+
+    synchronized private static final ActorSystem getOrCreateInstance(final BundleContext bundleContext, ConfigurationReader configurationReader) {
+
+        AtomicReference<ActorSystem> actorSystemReference = persistentActorSystem;
+        String configurationName = CONFIGURATION_NAME;
+        String actorSystemName = ACTOR_SYSTEM_NAME;
+
+        if (actorSystemReference.get() != null){
+            return actorSystemReference.get();
+        }
 
+        // 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;
     }
+
 }