Remove PeerUp/Down messages
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / shardmanager / ShardInformation.java
index a487ff1564e9cd2b892a928b10edc82948e87010..ea882dcbdf03ad3f26a3a90ab73f2d2d719e09af 100644 (file)
@@ -7,10 +7,12 @@
  */
 package org.opendaylight.controller.cluster.datastore.shardmanager;
 
+import static java.util.Objects.requireNonNull;
+
 import akka.actor.ActorRef;
 import akka.actor.Props;
 import akka.serialization.Serialization;
-import com.google.common.base.Preconditions;
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Strings;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -18,23 +20,21 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
-import javax.annotation.Nullable;
-import org.opendaylight.controller.cluster.access.concepts.MemberName;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.controller.cluster.datastore.DatastoreContext;
 import org.opendaylight.controller.cluster.datastore.Shard;
 import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier;
 import org.opendaylight.controller.cluster.datastore.messages.PeerAddressResolved;
-import org.opendaylight.controller.cluster.datastore.messages.PeerDown;
-import org.opendaylight.controller.cluster.datastore.messages.PeerUp;
 import org.opendaylight.controller.cluster.datastore.shardmanager.ShardManager.OnShardInitialized;
 import org.opendaylight.controller.cluster.datastore.shardmanager.ShardManager.OnShardReady;
 import org.opendaylight.controller.cluster.raft.RaftState;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.ReadOnlyDataTree;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-final class ShardInformation {
+@VisibleForTesting
+public final class ShardInformation {
     private static final Logger LOG = LoggerFactory.getLogger(ShardInformation.class);
 
     private final Set<OnShardInitialized> onShardInitializedSet = new HashSet<>();
@@ -42,8 +42,14 @@ final class ShardInformation {
     private final ShardPeerAddressResolver addressResolver;
     private final ShardIdentifier shardId;
     private final String shardName;
+
+    // This reference indirection is required to have the ability to update the SchemaContext
+    // inside actor props. Otherwise we would be keeping an old SchemaContext there, preventing
+    // it from becoming garbage.
+    private final AtomicShardContextProvider schemaContextProvider = new AtomicShardContextProvider();
     private ActorRef actor;
-    private Optional<DataTree> localShardDataTree;
+
+    private Optional<ReadOnlyDataTree> localShardDataTree;
     private boolean leaderAvailable = false;
 
     // flag that determines if the actor is ready for business
@@ -57,11 +63,11 @@ final class ShardInformation {
 
     private DatastoreContext datastoreContext;
     private Shard.AbstractBuilder<?, ?> builder;
-    private boolean isActiveMember = true;
+    private boolean activeMember = true;
 
-    ShardInformation(String shardName, ShardIdentifier shardId,
-            Map<String, String> initialPeerAddresses, DatastoreContext datastoreContext,
-            Shard.AbstractBuilder<?, ?> builder, ShardPeerAddressResolver addressResolver) {
+    ShardInformation(final String shardName, final ShardIdentifier shardId,
+            final Map<String, String> initialPeerAddresses, final DatastoreContext datastoreContext,
+            final Shard.AbstractBuilder<?, ?> builder, final ShardPeerAddressResolver addressResolver) {
         this.shardName = shardName;
         this.shardId = shardId;
         this.initialPeerAddresses = initialPeerAddresses;
@@ -70,10 +76,9 @@ final class ShardInformation {
         this.addressResolver = addressResolver;
     }
 
-    Props newProps(SchemaContext schemaContext) {
-        Preconditions.checkNotNull(builder);
-        Props props = builder.id(shardId).peerAddresses(initialPeerAddresses).datastoreContext(datastoreContext)
-                .schemaContext(schemaContext).props();
+    Props newProps() {
+        Props props = requireNonNull(builder).id(shardId).peerAddresses(initialPeerAddresses)
+                .datastoreContext(datastoreContext).schemaContextProvider(schemaContextProvider).props();
         builder = null;
         return props;
     }
@@ -82,12 +87,12 @@ final class ShardInformation {
         return shardName;
     }
 
-    @Nullable
-    ActorRef getActor() {
+    @VisibleForTesting
+    @Nullable public ActorRef getActor() {
         return actor;
     }
 
-    void setActor(ActorRef actor) {
+    void setActor(final ActorRef actor) {
         this.actor = actor;
     }
 
@@ -95,11 +100,11 @@ final class ShardInformation {
         return shardId;
     }
 
-    void setLocalDataTree(Optional<DataTree> localShardDataTree) {
-        this.localShardDataTree = localShardDataTree;
+    void setLocalDataTree(final Optional<ReadOnlyDataTree> dataTree) {
+        this.localShardDataTree = dataTree;
     }
 
-    Optional<DataTree> getLocalShardDataTree() {
+    Optional<ReadOnlyDataTree> getLocalShardDataTree() {
         return localShardDataTree;
     }
 
@@ -107,15 +112,15 @@ final class ShardInformation {
         return datastoreContext;
     }
 
-    void setDatastoreContext(DatastoreContext datastoreContext, ActorRef sender) {
-        this.datastoreContext = datastoreContext;
+    void setDatastoreContext(final DatastoreContext newDatastoreContext, final ActorRef sender) {
+        this.datastoreContext = newDatastoreContext;
         if (actor != null) {
             LOG.debug("Sending new DatastoreContext to {}", shardId);
             actor.tell(this.datastoreContext, sender);
         }
     }
 
-    void updatePeerAddress(String peerId, String peerAddress, ActorRef sender) {
+    void updatePeerAddress(final String peerId, final String peerAddress, final ActorRef sender) {
         LOG.info("updatePeerAddress for peer {} with address {}", peerId, peerAddress);
 
         if (actor != null) {
@@ -128,18 +133,6 @@ final class ShardInformation {
         notifyOnShardInitializedCallbacks();
     }
 
-    void peerDown(MemberName memberName, String peerId, ActorRef sender) {
-        if (actor != null) {
-            actor.tell(new PeerDown(memberName, peerId), sender);
-        }
-    }
-
-    void peerUp(MemberName memberName, String peerId, ActorRef sender) {
-        if (actor != null) {
-            actor.tell(new PeerUp(memberName, peerId), sender);
-        }
-    }
-
     boolean isShardReady() {
         return !RaftState.Candidate.name().equals(role) && !Strings.isNullOrEmpty(role);
     }
@@ -195,21 +188,25 @@ final class ShardInformation {
         }
     }
 
-    void addOnShardInitialized(OnShardInitialized onShardInitialized) {
+    void addOnShardInitialized(final OnShardInitialized onShardInitialized) {
         onShardInitializedSet.add(onShardInitialized);
     }
 
-    void removeOnShardInitialized(OnShardInitialized onShardInitialized) {
+    void removeOnShardInitialized(final OnShardInitialized onShardInitialized) {
         onShardInitializedSet.remove(onShardInitialized);
     }
 
-    void setRole(String newRole) {
+    void setRole(final String newRole) {
         this.role = newRole;
 
         notifyOnShardInitializedCallbacks();
     }
 
-    void setFollowerSyncStatus(boolean syncStatus) {
+    String getRole() {
+        return role;
+    }
+
+    void setFollowerSyncStatus(final boolean syncStatus) {
         this.followerSyncStatus = syncStatus;
     }
 
@@ -223,10 +220,10 @@ final class ShardInformation {
         return false;
     }
 
-    boolean setLeaderId(String leaderId) {
-        final boolean changed = !Objects.equals(this.leaderId, leaderId);
-        this.leaderId = leaderId;
-        if (leaderId != null) {
+    boolean setLeaderId(final String newLeaderId) {
+        final boolean changed = !Objects.equals(this.leaderId, newLeaderId);
+        this.leaderId = newLeaderId;
+        if (newLeaderId != null) {
             this.leaderAvailable = true;
         }
         notifyOnShardInitializedCallbacks();
@@ -238,7 +235,7 @@ final class ShardInformation {
         return leaderId;
     }
 
-    void setLeaderAvailable(boolean leaderAvailable) {
+    void setLeaderAvailable(final boolean leaderAvailable) {
         this.leaderAvailable = leaderAvailable;
 
         if (leaderAvailable) {
@@ -250,15 +247,37 @@ final class ShardInformation {
         return leaderVersion;
     }
 
-    void setLeaderVersion(short leaderVersion) {
+    void setLeaderVersion(final short leaderVersion) {
         this.leaderVersion = leaderVersion;
     }
 
     boolean isActiveMember() {
-        return isActiveMember;
+        return activeMember;
+    }
+
+    void setActiveMember(final boolean isActiveMember) {
+        this.activeMember = isActiveMember;
+    }
+
+    EffectiveModelContext getSchemaContext() {
+        return schemaContextProvider.getEffectiveModelContext();
     }
 
-    void setActiveMember(boolean isActiveMember) {
-        this.isActiveMember = isActiveMember;
+    void setSchemaContext(final EffectiveModelContext schemaContext) {
+        schemaContextProvider.set(requireNonNull(schemaContext));
     }
+
+    @VisibleForTesting
+    Shard.AbstractBuilder<?, ?> getBuilder() {
+        return builder;
+    }
+
+    @Override
+    public String toString() {
+        return "ShardInformation [shardId=" + shardId + ", leaderAvailable=" + leaderAvailable + ", actorInitialized="
+                + actorInitialized + ", followerSyncStatus=" + followerSyncStatus + ", role=" + role + ", leaderId="
+                + leaderId + ", activeMember=" + activeMember + "]";
+    }
+
+
 }