X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FShardManager.java;h=8d8527a240fab4ebdeed00aae39882f108944b19;hp=63266d6308287d2e816724f3f73b192b0d120bce;hb=e22159a0e53bf93a94908e2c3988ceeba9ed8183;hpb=31c83799d67d0bf4012aefedaba5356ebfaad8ab diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java index 63266d6308..8d8527a240 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardManager.java @@ -8,11 +8,16 @@ package org.opendaylight.controller.cluster.datastore; +import akka.actor.ActorPath; +import akka.actor.ActorRef; import akka.actor.Address; +import akka.actor.Props; import akka.actor.UntypedActor; import akka.event.Logging; import akka.event.LoggingAdapter; +import akka.japi.Creator; import org.opendaylight.controller.cluster.datastore.messages.FindPrimary; +import org.opendaylight.controller.cluster.datastore.messages.PrimaryFound; import org.opendaylight.controller.cluster.datastore.messages.PrimaryNotFound; import java.util.HashMap; @@ -21,41 +26,74 @@ import java.util.Map; /** * The ShardManager has the following jobs, - * - * - Create all the local shard replicas that belong on this cluster member - * - Find the primary replica for any given shard - * - Engage in shard replica elections which decide which replica should be the primary - * - * Creation of Shard replicas - * ========================== - * When the ShardManager is constructed it reads the cluster configuration to find out which shard replicas - * belong on this member. It finds out the name of the current cluster member from the Akka Clustering Service. - * - * Replica Elections - * ================= - * The Shard Manager uses multiple cues to initiate election. - * - When a member of the cluster dies - * - When a local shard replica dies - * - When a local shard replica comes alive + *

+ *

  • Create all the local shard replicas that belong on this cluster member + *
  • Find the primary replica for any given shard + *
  • Engage in shard replica elections which decide which replica should be the primary + *

    + *

    + *

    >Creation of Shard replicas

    + * When the ShardManager is constructed it reads the cluster configuration to find out which shard replicas + * belong on this member. It finds out the name of the current cluster member from the Akka Clustering Service. + *

    + *

    + *

    Replica Elections

    + *

    + *

    + * The Shard Manager uses multiple cues to initiate election. + *

  • When a member of the cluster dies + *
  • When a local shard replica dies + *
  • When a local shard replica comes alive + *

    */ public class ShardManager extends UntypedActor { - // Stores a mapping between a shard name and the address of the current primary - private final Map shardNameToPrimaryAddress = new HashMap<>(); + // Stores a mapping between a shard name and the address of the current primary + private final Map shardNameToPrimaryAddress = new HashMap<>(); + + // Stores a mapping between a member name and the address of the member + private final Map memberNameToAddress = new HashMap<>(); + + // Stores a mapping between the shard name and all the members on which a replica of that shard are available + private final Map> shardNameToMembers = new HashMap<>(); - // Stores a mapping between a member name and the address of the member - private final Map memberNameToAddress = new HashMap<>(); + private final LoggingAdapter log = Logging.getLogger(getContext().system(), this); - // Stores a mapping between the shard name and all the members on which a replica of that shard are available - private final Map> shardNameToMembers = new HashMap<>(); + private final ActorPath defaultShardPath; - LoggingAdapter log = Logging.getLogger(getContext().system(), this); + /** + * + * @param type defines the kind of data that goes into shards created by this shard manager. Examples of type would be + * configuration or operational + */ + private ShardManager(String type){ + ActorRef actor = getContext().actorOf(Shard.props(Shard.DEFAULT_NAME + "-" + type)); + defaultShardPath = actor.path(); + } - @Override - public void onReceive(Object message) throws Exception { - if(message instanceof FindPrimary ){ - FindPrimary msg = ((FindPrimary) message); - getSender().tell(new PrimaryNotFound(msg.getShardName()), getSelf()); - } + public static Props props(final String type){ + return Props.create(new Creator(){ + + @Override + public ShardManager create() throws Exception { + return new ShardManager(type); + } + }); + } + + @Override + public void onReceive(Object message) throws Exception { + if (message instanceof FindPrimary) { + FindPrimary msg = ((FindPrimary) message); + String shardName = msg.getShardName(); + if(Shard.DEFAULT_NAME.equals(shardName)){ + getSender().tell(new PrimaryFound(defaultShardPath.toString()), getSelf()); + } else { + getSender().tell(new PrimaryNotFound(shardName), getSelf()); + } } + } + + }