blob: 81f00ded873325b663dc0a6067055b707b67d27c [file] [log] [blame]
Madan Jampani94c23532015-02-05 17:40:01 -08001package org.onosproject.store.consistent.impl;
2
3import java.util.Map;
4import java.util.concurrent.CompletableFuture;
5import java.util.concurrent.Executors;
6
7import net.kuujo.copycat.CopycatConfig;
8import net.kuujo.copycat.cluster.ClusterConfig;
9import net.kuujo.copycat.cluster.internal.coordinator.ClusterCoordinator;
10import net.kuujo.copycat.cluster.internal.coordinator.DefaultClusterCoordinator;
11import net.kuujo.copycat.util.concurrent.NamedThreadFactory;
12
Madan Jampani09342702015-02-05 23:32:40 -080013/**
14 * Manages a PartitionedDatabase.
15 */
Madan Jampani94c23532015-02-05 17:40:01 -080016public interface PartitionedDatabaseManager {
17 /**
18 * Opens the database.
19 *
20 * @return A completable future to be completed with the result once complete.
21 */
22 CompletableFuture<PartitionedDatabase> open();
23
24 /**
25 * Closes the database.
26 *
27 * @return A completable future to be completed with the result once complete.
28 */
29 CompletableFuture<Void> close();
30
31 /**
32 * Sets the partitioner to use for mapping keys to partitions.
33 *
34 * @param partitioner partitioner
35 */
36 void setPartitioner(Partitioner<String> partitioner);
37
38 /**
39 * Registers a new partition.
40 *
41 * @param partitionName partition name.
42 * @param partition partition.
43 */
44 void registerPartition(String partitionName, Database partition);
45
46 /**
47 * Returns all the registered database partitions.
48 *
49 * @return mapping of all registered database partitions.
50 */
51 Map<String, Database> getRegisteredPartitions();
52
53
54 /**
55 * Creates a new partitioned database.
56 *
57 * @param name The database name.
58 * @param clusterConfig The cluster configuration.
59 * @param partitionedDatabaseConfig The database configuration.
60
61 * @return The database.
62 */
63 public static PartitionedDatabase create(
64 String name,
65 ClusterConfig clusterConfig,
66 PartitionedDatabaseConfig partitionedDatabaseConfig) {
67 CopycatConfig copycatConfig = new CopycatConfig()
68 .withName(name)
69 .withClusterConfig(clusterConfig)
70 .withDefaultExecutor(Executors.newSingleThreadExecutor(new NamedThreadFactory("copycat-coordinator-%d")));
71 ClusterCoordinator coordinator = new DefaultClusterCoordinator(copycatConfig.resolve());
72 PartitionedDatabase partitionedDatabase = new PartitionedDatabase(coordinator);
73 partitionedDatabaseConfig.partitions().forEach((partitionName, partitionConfig) ->
74 partitionedDatabase.registerPartition(partitionName ,
75 coordinator.getResource(partitionName, partitionConfig.resolve(clusterConfig)
76 .withDefaultSerializer(copycatConfig.getDefaultSerializer().copy())
77 .withDefaultExecutor(copycatConfig.getDefaultExecutor()))));
78 partitionedDatabase.setPartitioner(
Madan Jampani09342702015-02-05 23:32:40 -080079 new SimpleKeyHashPartitioner(partitionedDatabase.getRegisteredPartitions()));
Madan Jampani94c23532015-02-05 17:40:01 -080080 return partitionedDatabase;
81 }
82}