From: Tomas Cere Date: Wed, 2 Jun 2021 09:53:15 +0000 (+0200) Subject: Remove prefix shard leftovers X-Git-Tag: v4.0.0~32 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=dcc776a5e749d495a66e8753e123a1ddbd15d9c6 Remove prefix shard leftovers With the removal of everything producer related we can also remove everything related to prefix shards. JIRA: CONTROLLER-1977 Change-Id: I05bd1a286cd8fac252c122d2118d1d7dedcc8941 Signed-off-by: Tomas Cere --- diff --git a/opendaylight/md-sal/sal-cluster-admin-api/src/main/yang/cluster-admin.yang b/opendaylight/md-sal/sal-cluster-admin-api/src/main/yang/cluster-admin.yang index 260623f487..607bff6456 100644 --- a/opendaylight/md-sal/sal-cluster-admin-api/src/main/yang/cluster-admin.yang +++ b/opendaylight/md-sal/sal-cluster-admin-api/src/main/yang/cluster-admin.yang @@ -119,49 +119,6 @@ module cluster-admin { within two election timeout periods the operation fails."; } - rpc add-prefix-shard-replica { - input { - leaf shard-prefix { - mandatory true; - type instance-identifier; - } - - leaf data-store-type { - mandatory true; - type data-store-type; - description "The type of the data store to which the replica belongs"; - } - } - - description "Adds a replica of a shard to this node and joins it to an existing cluster. There must already be - a shard existing on another node with a leader. This RPC first contacts peer member seed nodes - searching for a shard. When found, an AddServer message is sent to the shard leader and applied as - described in the Raft paper."; - } - - rpc remove-prefix-shard-replica { - input { - leaf shard-prefix { - mandatory true; - type instance-identifier; - } - leaf member-name { - mandatory true; - type string; - description "The cluster member from which the shard replica should be removed"; - } - - leaf data-store-type { - mandatory true; - type data-store-type; - description "The type of the data store to which the replica belongs"; - } - } - - description "Removes an existing replica of a prefix shard from this node via the RemoveServer mechanism as - described in the Raft paper."; - } - rpc add-replicas-for-all-shards { output { uses shard-result-output; @@ -287,30 +244,6 @@ module cluster-admin { } } - rpc get-prefix-shard-role { - input { - leaf shard-prefix { - mandatory true; - type instance-identifier; - } - - leaf data-store-type { - mandatory true; - type data-store-type; - description "The type of the data store to which the replica belongs"; - } - } - - output { - leaf role { - type string; - description "Current role for the given shard, if not present the shard currently does not have a role"; - } - } - - description "Returns the current role for the requested module shard."; - } - rpc get-known-clients-for-all-shards { description "Request all shards to report their known frontend clients. This is useful for determining what generation should a resurrected member node should use."; diff --git a/opendaylight/md-sal/sal-cluster-admin-impl/src/main/java/org/opendaylight/controller/cluster/datastore/admin/ClusterAdminRpcService.java b/opendaylight/md-sal/sal-cluster-admin-impl/src/main/java/org/opendaylight/controller/cluster/datastore/admin/ClusterAdminRpcService.java index 4e1481e421..cc1152bb84 100644 --- a/opendaylight/md-sal/sal-cluster-admin-impl/src/main/java/org/opendaylight/controller/cluster/datastore/admin/ClusterAdminRpcService.java +++ b/opendaylight/md-sal/sal-cluster-admin-impl/src/main/java/org/opendaylight/controller/cluster/datastore/admin/ClusterAdminRpcService.java @@ -40,7 +40,6 @@ import org.apache.commons.lang3.SerializationUtils; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.controller.cluster.access.concepts.MemberName; import org.opendaylight.controller.cluster.datastore.DistributedDataStoreInterface; -import org.opendaylight.controller.cluster.datastore.messages.AddPrefixShardReplica; import org.opendaylight.controller.cluster.datastore.messages.AddShardReplica; import org.opendaylight.controller.cluster.datastore.messages.ChangeShardMembersVotingStatus; import org.opendaylight.controller.cluster.datastore.messages.FlipShardMembersVotingStatus; @@ -50,17 +49,12 @@ import org.opendaylight.controller.cluster.datastore.messages.GetShardRole; import org.opendaylight.controller.cluster.datastore.messages.GetShardRoleReply; import org.opendaylight.controller.cluster.datastore.messages.MakeLeaderLocal; import org.opendaylight.controller.cluster.datastore.messages.PrimaryShardInfo; -import org.opendaylight.controller.cluster.datastore.messages.RemovePrefixShardReplica; import org.opendaylight.controller.cluster.datastore.messages.RemoveShardReplica; import org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshot; import org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshotList; import org.opendaylight.controller.cluster.datastore.utils.ActorUtils; -import org.opendaylight.controller.cluster.datastore.utils.ClusterUtils; import org.opendaylight.controller.cluster.raft.client.messages.GetSnapshot; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.AddPrefixShardReplicaInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.AddPrefixShardReplicaOutput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.AddPrefixShardReplicaOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.AddReplicasForAllShardsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.AddReplicasForAllShardsOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.AddReplicasForAllShardsOutputBuilder; @@ -84,9 +78,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controll import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetKnownClientsForAllShardsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetKnownClientsForAllShardsOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetKnownClientsForAllShardsOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetPrefixShardRoleInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetPrefixShardRoleOutput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetPrefixShardRoleOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetShardRoleInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetShardRoleOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.GetShardRoleOutputBuilder; @@ -99,9 +90,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controll import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemoveAllShardReplicasInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemoveAllShardReplicasOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemoveAllShardReplicasOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemovePrefixShardReplicaInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemovePrefixShardReplicaOutput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemovePrefixShardReplicaOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemoveShardReplicaInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemoveShardReplicaOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.RemoveShardReplicaOutputBuilder; @@ -114,13 +102,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controll import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.shard.result.output.ShardResult; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.shard.result.output.ShardResultBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.cluster.admin.rev151013.shard.result.output.ShardResultKey; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.common.Uint32; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import scala.concurrent.Future; @@ -327,85 +313,6 @@ public class ClusterAdminRpcService implements ClusterAdminService { return future; } - @Override - public ListenableFuture> addPrefixShardReplica( - final AddPrefixShardReplicaInput input) { - - final InstanceIdentifier identifier = input.getShardPrefix(); - if (identifier == null) { - return newFailedRpcResultFuture("A valid shard identifier must be specified"); - } - - final DataStoreType dataStoreType = input.getDataStoreType(); - if (dataStoreType == null) { - return newFailedRpcResultFuture("A valid DataStoreType must be specified"); - } - - LOG.info("Adding replica for shard {}, datastore type {}", identifier, dataStoreType); - - final YangInstanceIdentifier prefix = serializer.toYangInstanceIdentifier(identifier); - final SettableFuture> returnFuture = SettableFuture.create(); - ListenableFuture future = sendMessageToShardManager(dataStoreType, new AddPrefixShardReplica(prefix)); - Futures.addCallback(future, new FutureCallback() { - @Override - public void onSuccess(final Success success) { - LOG.info("Successfully added replica for shard {}", prefix); - returnFuture.set(newSuccessfulResult(new AddPrefixShardReplicaOutputBuilder().build())); - } - - @Override - public void onFailure(final Throwable failure) { - onMessageFailure(String.format("Failed to add replica for shard %s", prefix), - returnFuture, failure); - } - }, MoreExecutors.directExecutor()); - - return returnFuture; - } - - @Override - public ListenableFuture> removePrefixShardReplica( - final RemovePrefixShardReplicaInput input) { - - final InstanceIdentifier identifier = input.getShardPrefix(); - if (identifier == null) { - return newFailedRpcResultFuture("A valid shard identifier must be specified"); - } - - final DataStoreType dataStoreType = input.getDataStoreType(); - if (dataStoreType == null) { - return newFailedRpcResultFuture("A valid DataStoreType must be specified"); - } - - final String memberName = input.getMemberName(); - if (Strings.isNullOrEmpty(memberName)) { - return newFailedRpcResultFuture("A valid member name must be specified"); - } - - LOG.info("Removing replica for shard {} memberName {}, datastoreType {}", - identifier, memberName, dataStoreType); - final YangInstanceIdentifier prefix = serializer.toYangInstanceIdentifier(identifier); - - final SettableFuture> returnFuture = SettableFuture.create(); - final ListenableFuture future = sendMessageToShardManager(dataStoreType, - new RemovePrefixShardReplica(prefix, MemberName.forName(memberName))); - Futures.addCallback(future, new FutureCallback() { - @Override - public void onSuccess(final Success success) { - LOG.info("Successfully removed replica for shard {}", prefix); - returnFuture.set(newSuccessfulResult(new RemovePrefixShardReplicaOutputBuilder().build())); - } - - @Override - public void onFailure(final Throwable failure) { - onMessageFailure(String.format("Failed to remove replica for shard %s", prefix), - returnFuture, failure); - } - }, MoreExecutors.directExecutor()); - - return returnFuture; - } - @Override public ListenableFuture> addReplicasForAllShards( final AddReplicasForAllShardsInput input) { @@ -568,53 +475,6 @@ public class ClusterAdminRpcService implements ClusterAdminService { return returnFuture; } - @Override - public ListenableFuture> getPrefixShardRole( - final GetPrefixShardRoleInput input) { - final InstanceIdentifier identifier = input.getShardPrefix(); - if (identifier == null) { - return newFailedRpcResultFuture("A valid shard identifier must be specified"); - } - - final DataStoreType dataStoreType = input.getDataStoreType(); - if (dataStoreType == null) { - return newFailedRpcResultFuture("A valid DataStoreType must be specified"); - } - - LOG.info("Getting prefix shard role for shard: {}, datastore type {}", identifier, dataStoreType); - - final YangInstanceIdentifier prefix = serializer.toYangInstanceIdentifier(identifier); - final String shardName = ClusterUtils.getCleanShardName(prefix); - final SettableFuture> returnFuture = SettableFuture.create(); - ListenableFuture future = sendMessageToShardManager(dataStoreType, - new GetShardRole(shardName)); - Futures.addCallback(future, new FutureCallback() { - @Override - public void onSuccess(final GetShardRoleReply reply) { - if (reply == null) { - returnFuture.set(ClusterAdminRpcService.newFailedRpcResultBuilder( - "No Shard role present. Please retry..").build()); - return; - } - - LOG.info("Successfully received role:{} for shard {}", reply.getRole(), shardName); - final GetPrefixShardRoleOutputBuilder builder = new GetPrefixShardRoleOutputBuilder(); - if (reply.getRole() != null) { - builder.setRole(reply.getRole()); - } - returnFuture.set(newSuccessfulResult(builder.build())); - } - - @Override - public void onFailure(final Throwable failure) { - returnFuture.set(ClusterAdminRpcService.newFailedRpcResultBuilder( - "Failed to get shard role.", failure).build()); - } - }, MoreExecutors.directExecutor()); - - return returnFuture; - } - @Override public ListenableFuture> backupDatastore(final BackupDatastoreInput input) { LOG.debug("backupDatastore: {}", input); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractDataStore.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractDataStore.java index a4c87279b6..3852978092 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractDataStore.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractDataStore.java @@ -34,7 +34,6 @@ import org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshot import org.opendaylight.controller.cluster.datastore.shardmanager.AbstractShardManagerCreator; import org.opendaylight.controller.cluster.datastore.shardmanager.ShardManagerCreator; import org.opendaylight.controller.cluster.datastore.utils.ActorUtils; -import org.opendaylight.controller.cluster.datastore.utils.ClusterUtils; import org.opendaylight.controller.cluster.datastore.utils.PrimaryShardInfoFutureCache; import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener; import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener; @@ -359,21 +358,6 @@ public abstract class AbstractDataStore implements DistributedDataStoreInterface return (ListenerRegistration) listenerRegistrationProxy; } - @Override - @SuppressWarnings("unchecked") - public ListenerRegistration registerShardConfigListener( - final YangInstanceIdentifier internalPath, final DOMDataTreeChangeListener delegate) { - requireNonNull(delegate, "delegate should not be null"); - - LOG.debug("Registering a listener for the configuration shard: {}", internalPath); - - final DataTreeChangeListenerProxy proxy = - new DataTreeChangeListenerProxy<>(actorUtils, delegate, internalPath); - proxy.init(ClusterUtils.PREFIX_CONFIG_SHARD_ID); - - return (ListenerRegistration) proxy; - } - private Duration initialSettleTime() { final DatastoreContext context = actorUtils.getDatastoreContext(); final int multiplier = context.getInitialSettleTimeoutMultiplier(); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreInterface.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreInterface.java index 59ccc58d9d..deae01960b 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreInterface.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreInterface.java @@ -23,10 +23,6 @@ public interface DistributedDataStoreInterface extends DOMStore { ActorUtils getActorUtils(); - @Beta - ListenerRegistration registerShardConfigListener( - YangInstanceIdentifier internalPath, DOMDataTreeChangeListener delegate); - @Beta ListenerRegistration registerProxyListener( YangInstanceIdentifier shardLookup, YangInstanceIdentifier insideShard, diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/OSGiDOMStore.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/OSGiDOMStore.java index 876dc5c4e4..d53a8bb468 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/OSGiDOMStore.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/OSGiDOMStore.java @@ -55,12 +55,6 @@ public final class OSGiDOMStore return datastore.getActorUtils(); } - @Override - public ListenerRegistration registerShardConfigListener( - final YangInstanceIdentifier internalPath, final DOMDataTreeChangeListener delegate) { - return datastore.registerShardConfigListener(internalPath, delegate); - } - @Override public ListenerRegistration registerProxyListener( final YangInstanceIdentifier shardLookup, final YangInstanceIdentifier insideShard, diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/config/Configuration.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/config/Configuration.java index a2e1957953..4325c7f268 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/config/Configuration.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/config/Configuration.java @@ -8,13 +8,11 @@ package org.opendaylight.controller.cluster.datastore.config; import java.util.Collection; -import java.util.Map; import java.util.Set; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.controller.cluster.access.concepts.MemberName; import org.opendaylight.controller.cluster.datastore.shardstrategy.ShardStrategy; -import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; public interface Configuration { @@ -33,11 +31,6 @@ public interface Configuration { */ @Nullable String getShardNameForModule(@NonNull String moduleName); - /** - * Return the shard name corresponding to the prefix, or null if none is configured. - */ - @Nullable String getShardNameForPrefix(@NonNull DOMDataTreeIdentifier prefix); - /** * Returns the member replicas for the given shard name. */ @@ -58,23 +51,6 @@ public interface Configuration { */ void addModuleShardConfiguration(@NonNull ModuleShardConfiguration config); - /** - * Adds a new configuration for a shard based on prefix. - */ - void addPrefixShardConfiguration(@NonNull PrefixShardConfiguration config); - - /** - * Removes a shard configuration for the specified prefix. - */ - void removePrefixShardConfiguration(@NonNull DOMDataTreeIdentifier prefix); - - /** - * Returns the configuration for all configured prefix shards. - * - * @return An immutable copy of the currently configured prefix shards. - */ - Map getAllPrefixShardConfigurations(); - /** * Returns a unique set of all member names configured for all shards. */ @@ -94,9 +70,4 @@ public interface Configuration { * Removes the given member as a replica for the given shardName. */ void removeMemberReplicaForShard(String shardName, MemberName memberName); - - /** - * Returns the ShardStrategy for the given prefix or null if the prefix is not found. - */ - @Nullable ShardStrategy getStrategyForPrefix(@NonNull DOMDataTreeIdentifier prefix); } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/config/ConfigurationImpl.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/config/ConfigurationImpl.java index 8e132f26d1..1ede88c3cb 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/config/ConfigurationImpl.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/config/ConfigurationImpl.java @@ -11,7 +11,6 @@ import static java.util.Objects.requireNonNull; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -19,23 +18,14 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import org.opendaylight.controller.cluster.access.concepts.MemberName; -import org.opendaylight.controller.cluster.datastore.shardstrategy.PrefixShardStrategy; import org.opendaylight.controller.cluster.datastore.shardstrategy.ShardStrategy; import org.opendaylight.controller.cluster.datastore.shardstrategy.ShardStrategyFactory; -import org.opendaylight.controller.cluster.datastore.utils.ClusterUtils; -import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -// TODO clean this up once we get rid of module based configuration, prefix one should be alot simpler public class ConfigurationImpl implements Configuration { private volatile Map moduleConfigMap; - // TODO should this be initialized with something? on restart we should restore the shards from configuration? - private volatile Map prefixConfigMap = Collections.emptyMap(); - // Look up maps to speed things up private volatile Map namespaceToModuleName; @@ -120,24 +110,6 @@ public class ConfigurationImpl implements Configuration { return moduleConfigMap.get(requireNonNull(moduleName, "moduleName should not be null")); } - @Override - public String getShardNameForPrefix(final DOMDataTreeIdentifier prefix) { - requireNonNull(prefix, "prefix should not be null"); - - Entry bestMatchEntry = new SimpleEntry<>( - new DOMDataTreeIdentifier(prefix.getDatastoreType(), YangInstanceIdentifier.empty()), null); - - for (Entry entry : prefixConfigMap.entrySet()) { - if (entry.getKey().contains(prefix) && entry.getKey().getRootIdentifier().getPathArguments().size() - > bestMatchEntry.getKey().getRootIdentifier().getPathArguments().size()) { - bestMatchEntry = entry; - } - } - - //TODO we really should have mapping based on prefix instead of Strings - return ClusterUtils.getCleanShardName(bestMatchEntry.getKey().getRootIdentifier()); - } - @Override public Collection getMembersFromShardName(final String shardName) { checkNotNullShardName(shardName); @@ -149,12 +121,6 @@ public class ConfigurationImpl implements Configuration { } } - for (final PrefixShardConfiguration prefixConfig : prefixConfigMap.values()) { - if (shardName.equals(ClusterUtils.getCleanShardName(prefixConfig.getPrefix().getRootIdentifier()))) { - return prefixConfig.getShardMemberNames(); - } - } - return Collections.emptyList(); } @@ -193,40 +159,6 @@ public class ConfigurationImpl implements Configuration { allShardNames = ImmutableSet.builder().addAll(allShardNames).add(config.getShardName()).build(); } - @Override - public void addPrefixShardConfiguration(final PrefixShardConfiguration config) { - addPrefixConfig(requireNonNull(config, "PrefixShardConfiguration cannot be null")); - allShardNames = ImmutableSet.builder().addAll(allShardNames) - .add(ClusterUtils.getCleanShardName(config.getPrefix().getRootIdentifier())).build(); - } - - @Override - public void removePrefixShardConfiguration(final DOMDataTreeIdentifier prefix) { - removePrefixConfig(requireNonNull(prefix, "Prefix cannot be null")); - - final HashSet temp = new HashSet<>(allShardNames); - temp.remove(ClusterUtils.getCleanShardName(prefix.getRootIdentifier())); - - allShardNames = ImmutableSet.copyOf(temp); - } - - @Override - public Map getAllPrefixShardConfigurations() { - return ImmutableMap.copyOf(prefixConfigMap); - } - - private void addPrefixConfig(final PrefixShardConfiguration config) { - final Map newPrefixConfigMap = new HashMap<>(prefixConfigMap); - newPrefixConfigMap.put(config.getPrefix(), config); - prefixConfigMap = ImmutableMap.copyOf(newPrefixConfigMap); - } - - private void removePrefixConfig(final DOMDataTreeIdentifier prefix) { - final Map newPrefixConfigMap = new HashMap<>(prefixConfigMap); - newPrefixConfigMap.remove(prefix); - prefixConfigMap = ImmutableMap.copyOf(newPrefixConfigMap); - } - private ShardStrategy createShardStrategy(final String moduleName, final String shardStrategyName) { return ShardStrategyFactory.newShardStrategyInstance(moduleName, shardStrategyName, this); } @@ -269,28 +201,6 @@ public class ConfigurationImpl implements Configuration { } } - @Override - public ShardStrategy getStrategyForPrefix(final DOMDataTreeIdentifier prefix) { - requireNonNull(prefix, "Prefix cannot be null"); - // FIXME using prefix tables like in mdsal will be better - Entry bestMatchEntry = new SimpleEntry<>( - new DOMDataTreeIdentifier(prefix.getDatastoreType(), YangInstanceIdentifier.empty()), null); - - for (Entry entry : prefixConfigMap.entrySet()) { - if (entry.getKey().contains(prefix) && entry.getKey().getRootIdentifier().getPathArguments().size() - > bestMatchEntry.getKey().getRootIdentifier().getPathArguments().size()) { - bestMatchEntry = entry; - } - } - - if (bestMatchEntry.getValue() == null) { - return null; - } - return new PrefixShardStrategy(ClusterUtils - .getCleanShardName(bestMatchEntry.getKey().getRootIdentifier()), - bestMatchEntry.getKey().getRootIdentifier()); - } - private void updateModuleConfigMap(final ModuleConfig moduleConfig) { final Map newModuleConfigMap = new HashMap<>(moduleConfigMap); newModuleConfigMap.put(moduleConfig.getName(), moduleConfig); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/config/PrefixShardConfiguration.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/config/PrefixShardConfiguration.java deleted file mode 100644 index dc6db2c6be..0000000000 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/config/PrefixShardConfiguration.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * 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.config; - -import static java.util.Objects.requireNonNull; - -import com.google.common.collect.ImmutableSet; -import java.io.Externalizable; -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import org.opendaylight.controller.cluster.access.concepts.MemberName; -import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; - -/** - * Configuration for prefix based shards. - */ -public class PrefixShardConfiguration implements Serializable { - private static final class Proxy implements Externalizable { - private static final long serialVersionUID = 1L; - - private PrefixShardConfiguration prefixShardConfiguration; - - // checkstyle flags the public modifier as redundant which really doesn't make sense since it clearly isn't - // redundant. It is explicitly needed for Java serialization to be able to create instances via reflection. - @SuppressWarnings("checkstyle:RedundantModifier") - public Proxy() { - } - - Proxy(final PrefixShardConfiguration prefixShardConfiguration) { - this.prefixShardConfiguration = prefixShardConfiguration; - } - - @Override - public void writeExternal(final ObjectOutput objectOutput) throws IOException { - objectOutput.writeObject(prefixShardConfiguration.getPrefix()); - objectOutput.writeObject(prefixShardConfiguration.getShardStrategyName()); - - objectOutput.writeInt(prefixShardConfiguration.getShardMemberNames().size()); - for (MemberName name : prefixShardConfiguration.getShardMemberNames()) { - name.writeTo(objectOutput); - } - } - - @Override - public void readExternal(final ObjectInput objectInput) throws IOException, ClassNotFoundException { - final DOMDataTreeIdentifier localPrefix = (DOMDataTreeIdentifier) objectInput.readObject(); - final String localStrategyName = (String) objectInput.readObject(); - - final int size = objectInput.readInt(); - final Collection localShardMemberNames = new ArrayList<>(size); - for (int i = 0; i < size; i++) { - localShardMemberNames.add(MemberName.readFrom(objectInput)); - } - - prefixShardConfiguration = new PrefixShardConfiguration(localPrefix, localStrategyName, - localShardMemberNames); - } - - private Object readResolve() { - return prefixShardConfiguration; - } - } - - private static final long serialVersionUID = 1L; - - private final DOMDataTreeIdentifier prefix; - private final String shardStrategyName; - private final Collection shardMemberNames; - - public PrefixShardConfiguration(final DOMDataTreeIdentifier prefix, - final String shardStrategyName, - final Collection shardMemberNames) { - this.prefix = requireNonNull(prefix); - this.shardStrategyName = requireNonNull(shardStrategyName); - this.shardMemberNames = ImmutableSet.copyOf(shardMemberNames); - } - - public DOMDataTreeIdentifier getPrefix() { - return prefix; - } - - public String getShardStrategyName() { - return shardStrategyName; - } - - public Collection getShardMemberNames() { - return shardMemberNames; - } - - @Override - public String toString() { - return "PrefixShardConfiguration{" - + "prefix=" + prefix - + ", shardStrategyName='" - + shardStrategyName + '\'' - + ", shardMemberNames=" + shardMemberNames - + '}'; - } - - private Object writeReplace() { - return new Proxy(this); - } -} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/AddPrefixShardReplica.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/AddPrefixShardReplica.java deleted file mode 100644 index ba25c0c3c9..0000000000 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/AddPrefixShardReplica.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2017 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * 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.messages; - -import static java.util.Objects.requireNonNull; - -import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; - -/** - * A message sent to the ShardManager to dynamically add a new local shard - * that is a replica for an existing prefix shard that is already available - * in the cluster. - */ -public class AddPrefixShardReplica { - - private final YangInstanceIdentifier prefix; - - /** - * Constructor. - * - * @param prefix prefix of the shard that is to be locally replicated. - */ - - public AddPrefixShardReplica(final @NonNull YangInstanceIdentifier prefix) { - this.prefix = requireNonNull(prefix, "prefix should not be null"); - } - - public YangInstanceIdentifier getShardPrefix() { - return this.prefix; - } - - @Override - public String toString() { - return "AddPrefixShardReplica[prefix=" + prefix + "]"; - } -} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RemovePrefixShardReplica.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RemovePrefixShardReplica.java deleted file mode 100644 index 3721ef1a5d..0000000000 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RemovePrefixShardReplica.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2017 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * 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.messages; - -import static java.util.Objects.requireNonNull; - -import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.controller.cluster.access.concepts.MemberName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; - -/** - * A message sent to the ShardManager to dynamically remove a local prefix shard - * replica available in this node. - */ -public class RemovePrefixShardReplica { - - private final YangInstanceIdentifier prefix; - private final MemberName memberName; - - /** - * Constructor. - * - * @param prefix prefix of the local shard that is to be dynamically removed. - */ - public RemovePrefixShardReplica(final @NonNull YangInstanceIdentifier prefix, - final @NonNull MemberName memberName) { - this.prefix = requireNonNull(prefix, "prefix should not be null"); - this.memberName = requireNonNull(memberName, "memberName should not be null"); - } - - public YangInstanceIdentifier getShardPrefix() { - return prefix; - } - - public MemberName getMemberName() { - return memberName; - } - - @Override - public String toString() { - return "RemovePrefixShardReplica [prefix=" + prefix + ", memberName=" + memberName + "]"; - } -} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/ShardManagerSnapshot.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/ShardManagerSnapshot.java index 0bacbd0dbc..728dd29ea3 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/ShardManagerSnapshot.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/ShardManagerSnapshot.java @@ -8,19 +8,14 @@ package org.opendaylight.controller.cluster.datastore.persisted; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.io.Serializable; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.controller.cluster.datastore.config.PrefixShardConfiguration; -import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; /** * Represents the persisted snapshot state for the ShardManager. @@ -52,12 +47,6 @@ public class ShardManagerSnapshot implements Serializable { for (String shard: snapshot.shardList) { out.writeObject(shard); } - - out.writeInt(snapshot.prefixShardConfiguration.size()); - for (Map.Entry prefixShardConfigEntry : snapshot.prefixShardConfiguration.entrySet()) { - out.writeObject(prefixShardConfigEntry.getKey()); - out.writeObject(prefixShardConfigEntry.getValue()); - } } @Override @@ -68,14 +57,7 @@ public class ShardManagerSnapshot implements Serializable { localShardList.add((String) in.readObject()); } - size = in.readInt(); - Map localPrefixShardConfiguration = new HashMap<>(size); - for (int i = 0; i < size; i++) { - localPrefixShardConfiguration.put((DOMDataTreeIdentifier) in.readObject(), - (PrefixShardConfiguration) in.readObject()); - } - - snapshot = new ShardManagerSnapshot(localShardList, localPrefixShardConfiguration); + snapshot = new ShardManagerSnapshot(localShardList); } private Object readResolve() { @@ -84,12 +66,9 @@ public class ShardManagerSnapshot implements Serializable { } private final List shardList; - private final Map prefixShardConfiguration; - public ShardManagerSnapshot(final @NonNull List shardList, - final Map prefixShardConfiguration) { + public ShardManagerSnapshot(final @NonNull List shardList) { this.shardList = ImmutableList.copyOf(shardList); - this.prefixShardConfiguration = ImmutableMap.copyOf(prefixShardConfiguration); } public List getShardList() { diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManager.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManager.java index 18bcadf151..e866400608 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManager.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManager.java @@ -55,19 +55,16 @@ import org.opendaylight.controller.cluster.common.actor.AbstractUntypedPersisten import org.opendaylight.controller.cluster.common.actor.Dispatchers; import org.opendaylight.controller.cluster.datastore.ClusterWrapper; import org.opendaylight.controller.cluster.datastore.DatastoreContext; -import org.opendaylight.controller.cluster.datastore.DatastoreContext.Builder; import org.opendaylight.controller.cluster.datastore.DatastoreContextFactory; import org.opendaylight.controller.cluster.datastore.Shard; import org.opendaylight.controller.cluster.datastore.config.Configuration; import org.opendaylight.controller.cluster.datastore.config.ModuleShardConfiguration; -import org.opendaylight.controller.cluster.datastore.config.PrefixShardConfiguration; import org.opendaylight.controller.cluster.datastore.exceptions.AlreadyExistsException; import org.opendaylight.controller.cluster.datastore.exceptions.NoShardLeaderException; import org.opendaylight.controller.cluster.datastore.exceptions.NotInitializedException; import org.opendaylight.controller.cluster.datastore.exceptions.PrimaryNotFoundException; import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier; import org.opendaylight.controller.cluster.datastore.messages.ActorInitialized; -import org.opendaylight.controller.cluster.datastore.messages.AddPrefixShardReplica; import org.opendaylight.controller.cluster.datastore.messages.AddShardReplica; import org.opendaylight.controller.cluster.datastore.messages.ChangeShardMembersVotingStatus; import org.opendaylight.controller.cluster.datastore.messages.CreateShard; @@ -81,13 +78,11 @@ import org.opendaylight.controller.cluster.datastore.messages.LocalShardFound; import org.opendaylight.controller.cluster.datastore.messages.LocalShardNotFound; import org.opendaylight.controller.cluster.datastore.messages.RemoteFindPrimary; import org.opendaylight.controller.cluster.datastore.messages.RemotePrimaryShardFound; -import org.opendaylight.controller.cluster.datastore.messages.RemovePrefixShardReplica; import org.opendaylight.controller.cluster.datastore.messages.RemoveShardReplica; import org.opendaylight.controller.cluster.datastore.messages.ShardLeaderStateChanged; import org.opendaylight.controller.cluster.datastore.messages.UpdateSchemaContext; import org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshot; import org.opendaylight.controller.cluster.datastore.persisted.ShardManagerSnapshot; -import org.opendaylight.controller.cluster.datastore.utils.ClusterUtils; import org.opendaylight.controller.cluster.datastore.utils.CompositeOnComplete; import org.opendaylight.controller.cluster.datastore.utils.PrimaryShardInfoFutureCache; import org.opendaylight.controller.cluster.notifications.RegisterRoleChangeListener; @@ -108,9 +103,7 @@ import org.opendaylight.controller.cluster.raft.messages.ServerChangeReply; import org.opendaylight.controller.cluster.raft.messages.ServerChangeStatus; import org.opendaylight.controller.cluster.raft.messages.ServerRemoved; import org.opendaylight.controller.cluster.raft.policy.DisableElectionsRaftPolicy; -import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; import org.opendaylight.yangtools.concepts.Registration; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -247,8 +240,6 @@ class ShardManager extends AbstractUntypedPersistentActorWithMetering { onCreateShard((CreateShard)message); } else if (message instanceof AddShardReplica) { onAddShardReplica((AddShardReplica) message); - } else if (message instanceof AddPrefixShardReplica) { - onAddPrefixShardReplica((AddPrefixShardReplica) message); } else if (message instanceof ForwardedAddServerReply) { ForwardedAddServerReply msg = (ForwardedAddServerReply)message; onAddServerReply(msg.shardInfo, msg.addServerReply, getSender(), msg.leaderPath, @@ -258,8 +249,6 @@ class ShardManager extends AbstractUntypedPersistentActorWithMetering { onAddServerFailure(msg.shardName, msg.failureMessage, msg.failure, getSender(), msg.removeShardOnFailure); } else if (message instanceof RemoveShardReplica) { onRemoveShardReplica((RemoveShardReplica) message); - } else if (message instanceof RemovePrefixShardReplica) { - onRemovePrefixShardReplica((RemovePrefixShardReplica) message); } else if (message instanceof WrappedShardResponse) { onWrappedShardResponse((WrappedShardResponse) message); } else if (message instanceof GetSnapshot) { @@ -395,49 +384,6 @@ class ShardManager extends AbstractUntypedPersistentActorWithMetering { } } - @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD", - justification = "https://github.com/spotbugs/spotbugs/issues/811") - private void removePrefixShardReplica(final RemovePrefixShardReplica contextMessage, final String shardName, - final String primaryPath, final ActorRef sender) { - if (isShardReplicaOperationInProgress(shardName, sender)) { - return; - } - - shardReplicaOperationsInProgress.add(shardName); - - final ShardIdentifier shardId = getShardIdentifier(contextMessage.getMemberName(), shardName); - - final DatastoreContext datastoreContext = newShardDatastoreContextBuilder(shardName).build(); - - //inform ShardLeader to remove this shard as a replica by sending an RemoveServer message - LOG.debug("{}: Sending RemoveServer message to peer {} for shard {}", persistenceId(), - primaryPath, shardId); - - Timeout removeServerTimeout = new Timeout(datastoreContext.getShardLeaderElectionTimeout().duration()); - Future futureObj = ask(getContext().actorSelection(primaryPath), - new RemoveServer(shardId.toString()), removeServerTimeout); - - futureObj.onComplete(new OnComplete<>() { - @Override - public void onComplete(final Throwable failure, final Object response) { - if (failure != null) { - shardReplicaOperationsInProgress.remove(shardName); - - LOG.debug("{}: RemoveServer request to leader {} for shard {} failed", persistenceId(), primaryPath, - shardName, failure); - - // FAILURE - sender.tell(new Status.Failure(new RuntimeException( - String.format("RemoveServer request to leader %s for shard %s failed", primaryPath, shardName), - failure)), self()); - } else { - // SUCCESS - self().tell(new WrappedShardResponse(shardId, response, primaryPath), sender); - } - } - }, new Dispatchers(context().system().dispatchers()).getDispatcher(Dispatchers.DispatcherType.Client)); - } - @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD", justification = "https://github.com/spotbugs/spotbugs/issues/811") private void removeShardReplica(final RemoveShardReplica contextMessage, final String shardName, @@ -1263,41 +1209,6 @@ class ShardManager extends AbstractUntypedPersistentActorWithMetering { return false; } - private void onAddPrefixShardReplica(final AddPrefixShardReplica message) { - LOG.debug("{}: onAddPrefixShardReplica: {}", persistenceId(), message); - - final ShardIdentifier shardId = getShardIdentifier(cluster.getCurrentMemberName(), - ClusterUtils.getCleanShardName(message.getShardPrefix())); - final String shardName = shardId.getShardName(); - - // Create the localShard - if (schemaContext == null) { - LOG.debug("{}: No SchemaContext is available in order to create a local shard instance for {}", - persistenceId(), shardName); - getSender().tell(new Status.Failure(new IllegalStateException( - "No SchemaContext is available in order to create a local shard instance for " + shardName)), - getSelf()); - return; - } - - findPrimary(shardName, new AutoFindPrimaryFailureResponseHandler(getSender(), shardName, persistenceId(), - getSelf()) { - @Override - public void onRemotePrimaryShardFound(final RemotePrimaryShardFound response) { - final RunnableMessage runnable = (RunnableMessage) () -> addPrefixShard(getShardName(), - message.getShardPrefix(), response, getSender()); - if (!isPreviousShardActorStopInProgress(getShardName(), runnable)) { - getSelf().tell(runnable, getTargetActor()); - } - } - - @Override - public void onLocalPrimaryFound(final LocalPrimaryShardFound message) { - sendLocalReplicaAlreadyExistsReply(getShardName(), getTargetActor()); - } - }); - } - private void onAddShardReplica(final AddShardReplica shardReplicaMsg) { final String shardName = shardReplicaMsg.getShardName(); @@ -1347,42 +1258,6 @@ class ShardManager extends AbstractUntypedPersistentActorWithMetering { String.format("Local shard %s already exists", shardName))), getSelf()); } - @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD", - justification = "https://github.com/spotbugs/spotbugs/issues/811") - private void addPrefixShard(final String shardName, final YangInstanceIdentifier shardPrefix, - final RemotePrimaryShardFound response, final ActorRef sender) { - if (isShardReplicaOperationInProgress(shardName, sender)) { - return; - } - - shardReplicaOperationsInProgress.add(shardName); - - final ShardInformation shardInfo; - final boolean removeShardOnFailure; - ShardInformation existingShardInfo = localShards.get(shardName); - if (existingShardInfo == null) { - removeShardOnFailure = true; - ShardIdentifier shardId = getShardIdentifier(cluster.getCurrentMemberName(), shardName); - - final Builder builder = newShardDatastoreContextBuilder(shardName); - builder.storeRoot(shardPrefix).customRaftPolicyImplementation(DisableElectionsRaftPolicy.class.getName()); - - DatastoreContext datastoreContext = builder.build(); - - shardInfo = new ShardInformation(shardName, shardId, getPeerAddresses(shardName), datastoreContext, - Shard.builder(), peerAddressResolver); - shardInfo.setActiveMember(false); - shardInfo.setSchemaContext(schemaContext); - localShards.put(shardName, shardInfo); - shardInfo.setActor(newShardActor(shardInfo)); - } else { - removeShardOnFailure = false; - shardInfo = existingShardInfo; - } - - execAddShard(shardName, shardInfo, response, removeShardOnFailure, sender); - } - @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD", justification = "https://github.com/spotbugs/spotbugs/issues/811") private void addShard(final String shardName, final RemotePrimaryShardFound response, final ActorRef sender) { @@ -1537,32 +1412,6 @@ class ShardManager extends AbstractUntypedPersistentActorWithMetering { }); } - private void onRemovePrefixShardReplica(final RemovePrefixShardReplica message) { - LOG.debug("{}: onRemovePrefixShardReplica: {}", persistenceId(), message); - - final ShardIdentifier shardId = getShardIdentifier(cluster.getCurrentMemberName(), - ClusterUtils.getCleanShardName(message.getShardPrefix())); - final String shardName = shardId.getShardName(); - - findPrimary(shardName, new AutoFindPrimaryFailureResponseHandler(getSender(), - shardName, persistenceId(), getSelf()) { - @Override - public void onRemotePrimaryShardFound(final RemotePrimaryShardFound response) { - doRemoveShardReplicaAsync(response.getPrimaryPath()); - } - - @Override - public void onLocalPrimaryFound(final LocalPrimaryShardFound response) { - doRemoveShardReplicaAsync(response.getPrimaryPath()); - } - - private void doRemoveShardReplicaAsync(final String primaryPath) { - getSelf().tell((RunnableMessage) () -> removePrefixShardReplica(message, getShardName(), - primaryPath, getSender()), getTargetActor()); - } - }); - } - private void persistShardList() { List shardList = new ArrayList<>(localShards.keySet()); for (ShardInformation shardInfo : localShards.values()) { @@ -1571,13 +1420,11 @@ class ShardManager extends AbstractUntypedPersistentActorWithMetering { } } LOG.debug("{}: persisting the shard list {}", persistenceId(), shardList); - saveSnapshot(updateShardManagerSnapshot(shardList, configuration.getAllPrefixShardConfigurations())); + saveSnapshot(updateShardManagerSnapshot(shardList)); } - private ShardManagerSnapshot updateShardManagerSnapshot( - final List shardList, - final Map allPrefixShardConfigurations) { - currentSnapshot = new ShardManagerSnapshot(shardList, allPrefixShardConfigurations); + private ShardManagerSnapshot updateShardManagerSnapshot(final List shardList) { + currentSnapshot = new ShardManagerSnapshot(shardList); return currentSnapshot; } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerSnapshot.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerSnapshot.java index efe24255c8..fdec785b7d 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerSnapshot.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerSnapshot.java @@ -9,7 +9,6 @@ package org.opendaylight.controller.cluster.datastore.shardmanager; import com.google.common.collect.ImmutableList; import java.io.Serializable; -import java.util.Collections; import java.util.List; import org.eclipse.jdt.annotation.NonNull; @@ -44,8 +43,7 @@ public final class ShardManagerSnapshot implements Serializable { } private Object readResolve() { - return new org.opendaylight.controller.cluster.datastore.persisted.ShardManagerSnapshot(shardList, - Collections.emptyMap()); + return new org.opendaylight.controller.cluster.datastore.persisted.ShardManagerSnapshot(shardList); } @Override diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/DefaultShardStrategy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/DefaultShardStrategy.java index 7e37b10e77..a0712b6714 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/DefaultShardStrategy.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/DefaultShardStrategy.java @@ -31,9 +31,4 @@ public final class DefaultShardStrategy implements ShardStrategy { public String findShard(YangInstanceIdentifier path) { return DEFAULT_SHARD; } - - @Override - public YangInstanceIdentifier getPrefixForPath(YangInstanceIdentifier path) { - return YangInstanceIdentifier.empty(); - } } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ModuleShardStrategy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ModuleShardStrategy.java index 772710bf2a..c90baf2760 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ModuleShardStrategy.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ModuleShardStrategy.java @@ -28,11 +28,4 @@ public class ModuleShardStrategy implements ShardStrategy { String shardName = configuration.getShardNameForModule(moduleName); return shardName != null ? shardName : DefaultShardStrategy.DEFAULT_SHARD; } - - @Override - public YangInstanceIdentifier getPrefixForPath(YangInstanceIdentifier path) { - return YangInstanceIdentifier.empty(); - } - - } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/PrefixShardStrategy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/PrefixShardStrategy.java deleted file mode 100644 index 25e1160c45..0000000000 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/PrefixShardStrategy.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * 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.shardstrategy; - -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; - -/** - * Shard Strategy that resolves a path to a prefix shard name. - */ -public class PrefixShardStrategy implements ShardStrategy { - - public static final String NAME = "prefix"; - - private final String shardName; - private final YangInstanceIdentifier prefix; - - public PrefixShardStrategy(final String shardName, - final YangInstanceIdentifier prefix) { - this.shardName = shardName != null ? shardName : DefaultShardStrategy.DEFAULT_SHARD; - this.prefix = prefix; - } - - @Override - public String findShard(final YangInstanceIdentifier path) { - return shardName; - } - - @Override - public YangInstanceIdentifier getPrefixForPath(YangInstanceIdentifier path) { - return prefix; - } -} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategy.java index 0a4c54b656..496069d0a1 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategy.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategy.java @@ -25,11 +25,4 @@ public interface ShardStrategy { * @return the corresponding shard name. */ String findShard(YangInstanceIdentifier path); - - /** - * Get the prefix of the shard that contains the data pointed to by the specified path. - * @param path the location of the data in the logical tree. - * @return the corresponding shards prefix. - */ - YangInstanceIdentifier getPrefixForPath(YangInstanceIdentifier path); } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategyFactory.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategyFactory.java index 5891c4f761..0a93c0d6b3 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategyFactory.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategyFactory.java @@ -11,34 +11,23 @@ import static com.google.common.base.Preconditions.checkState; import static java.util.Objects.requireNonNull; import org.opendaylight.controller.cluster.datastore.config.Configuration; -import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; public class ShardStrategyFactory { private static final String UNKNOWN_MODULE_NAME = "unknown"; private final Configuration configuration; - private final LogicalDatastoreType logicalStoreType; - public ShardStrategyFactory(final Configuration configuration, final LogicalDatastoreType logicalStoreType) { + public ShardStrategyFactory(final Configuration configuration) { checkState(configuration != null, "configuration should not be missing"); this.configuration = configuration; - this.logicalStoreType = requireNonNull(logicalStoreType); } public ShardStrategy getStrategy(final YangInstanceIdentifier path) { - // try with the legacy module based shard mapping final String moduleName = getModuleName(requireNonNull(path, "path should not be null")); final ShardStrategy shardStrategy = configuration.getStrategyForModule(moduleName); if (shardStrategy == null) { - // retry with prefix based sharding - final ShardStrategy strategyForPrefix = - configuration.getStrategyForPrefix(new DOMDataTreeIdentifier(logicalStoreType, path)); - if (strategyForPrefix == null) { - return DefaultShardStrategy.getInstance(); - } - return strategyForPrefix; + return DefaultShardStrategy.getInstance(); } return shardStrategy; diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ActorUtils.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ActorUtils.java index fcfa9296ae..a9a646cc9f 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ActorUtils.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ActorUtils.java @@ -52,7 +52,6 @@ import org.opendaylight.controller.cluster.datastore.messages.UpdateSchemaContex import org.opendaylight.controller.cluster.datastore.shardstrategy.ShardStrategyFactory; import org.opendaylight.controller.cluster.raft.client.messages.Shutdown; import org.opendaylight.controller.cluster.reporting.MetricsReporter; -import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.yangtools.yang.data.api.schema.tree.ReadOnlyDataTree; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.slf4j.Logger; @@ -161,10 +160,7 @@ public class ActorUtils { this.datastoreContext = datastoreContext; this.dispatchers = new Dispatchers(actorSystem.dispatchers()); this.primaryShardInfoCache = primaryShardInfoCache; - - final LogicalDatastoreType convertedType = - LogicalDatastoreType.valueOf(datastoreContext.getLogicalStoreType().name()); - this.shardStrategyFactory = new ShardStrategyFactory(configuration, convertedType); + this.shardStrategyFactory = new ShardStrategyFactory(configuration); setCachedProperties(); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ClusterUtils.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ClusterUtils.java deleted file mode 100644 index 927dca43e6..0000000000 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/ClusterUtils.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * 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.utils; - -import org.opendaylight.controller.cluster.access.concepts.MemberName; -import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier; -import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Utils for encoding prefix shard name. - */ -public final class ClusterUtils { - private static final Logger LOG = LoggerFactory.getLogger(ClusterUtils.class); - - // id for the shard used to store prefix configuration - public static final String PREFIX_CONFIG_SHARD_ID = "prefix-configuration-shard"; - - public static final QName PREFIX_SHARDS_QNAME = - QName.create("urn:opendaylight:params:xml:ns:yang:controller:md:sal:clustering:prefix-shard-configuration", - "2017-01-10", "prefix-shards").intern(); - public static final QName SHARD_LIST_QNAME = - QName.create(PREFIX_SHARDS_QNAME, "shard").intern(); - public static final QName SHARD_PREFIX_QNAME = - QName.create(PREFIX_SHARDS_QNAME, "prefix").intern(); - public static final QName SHARD_REPLICAS_QNAME = - QName.create(PREFIX_SHARDS_QNAME, "replicas").intern(); - public static final QName SHARD_REPLICA_QNAME = - QName.create(PREFIX_SHARDS_QNAME, "replica").intern(); - - public static final YangInstanceIdentifier PREFIX_SHARDS_PATH = - YangInstanceIdentifier.of(PREFIX_SHARDS_QNAME).toOptimized(); - public static final YangInstanceIdentifier SHARD_LIST_PATH = - PREFIX_SHARDS_PATH.node(SHARD_LIST_QNAME).toOptimized(); - - private ClusterUtils() { - } - - public static ShardIdentifier getShardIdentifier(final MemberName memberName, final DOMDataTreeIdentifier prefix) { - final String type; - switch (prefix.getDatastoreType()) { - case OPERATIONAL: - type = "operational"; - break; - case CONFIGURATION: - type = "config"; - break; - default: - type = prefix.getDatastoreType().name(); - LOG.warn("Unknown data store type {}", type); - } - - return ShardIdentifier.create(getCleanShardName(prefix.getRootIdentifier()), memberName, type); - } - - /** - * Returns an encoded shard name based on the provided path that should doesn't contain characters that cannot be - * present in akka actor paths. - * - * @param path Path on which to base the shard name - * @return encoded name that doesn't contain characters that cannot be in actor path. - */ - public static String getCleanShardName(final YangInstanceIdentifier path) { - if (path.isEmpty()) { - return "default"; - } - - final StringBuilder builder = new StringBuilder(); - // TODO need a better mapping that includes namespace, but we'll need to cleanup the string beforehand - // we have to fight both javax and akka url path restrictions.. - path.getPathArguments().forEach(p -> { - builder.append(p.getNodeType().getLocalName()); - if (p instanceof NodeIdentifierWithPredicates) { - builder.append("-key_"); - ((NodeIdentifierWithPredicates) p).entrySet().forEach(entry -> { - builder.append(entry.getKey().getLocalName()).append(entry.getValue()).append('-'); - }); - builder.append('_'); - } - builder.append('!'); - }); - return builder.toString(); - } -} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/yang/prefix-shard-configuration.yang b/opendaylight/md-sal/sal-distributed-datastore/src/main/yang/prefix-shard-configuration.yang deleted file mode 100644 index 02d5c304e0..0000000000 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/yang/prefix-shard-configuration.yang +++ /dev/null @@ -1,34 +0,0 @@ -module prefix-shard-configuration { - yang-version 1; - namespace "urn:opendaylight:params:xml:ns:yang:controller:md:sal:clustering:prefix-shard-configuration"; - prefix "prefix-config"; - - description - "This module contains the base YANG definitions for - shards based on prefix configuration"; - - revision "2017-01-10" { - description "Initial revision."; - } - - container prefix-shards { - - list shard { - key prefix; - leaf prefix { - type instance-identifier; - description "Prefix that this shard is rooted at."; - } - - container replicas { - leaf-list replica { - type string; - } - - description "List of cluster member nodes that this shard is replicated on"; - } - - description "List of prefix-based shards configured."; - } - } -} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/AbstractTransactionProxyTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/AbstractTransactionProxyTest.java index 5143547575..d3ae761b59 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/AbstractTransactionProxyTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/AbstractTransactionProxyTest.java @@ -76,7 +76,6 @@ import org.opendaylight.controller.cluster.datastore.utils.MockConfiguration; import org.opendaylight.controller.cluster.raft.utils.DoNothingActor; import org.opendaylight.controller.md.cluster.datastore.model.CarsModel; import org.opendaylight.controller.md.cluster.datastore.model.TestModel; -import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.common.api.ReadFailedException; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -105,22 +104,12 @@ public abstract class AbstractTransactionProxyTest extends AbstractTest { public String findShard(final YangInstanceIdentifier path) { return TestModel.JUNK_QNAME.getLocalName(); } - - @Override - public YangInstanceIdentifier getPrefixForPath(final YangInstanceIdentifier path) { - return YangInstanceIdentifier.empty(); - } }).put( CarsModel.BASE_QNAME.getLocalName(), new ShardStrategy() { @Override public String findShard(final YangInstanceIdentifier path) { return CarsModel.BASE_QNAME.getLocalName(); } - - @Override - public YangInstanceIdentifier getPrefixForPath(final YangInstanceIdentifier path) { - return YangInstanceIdentifier.empty(); - } }).build(); @Override @@ -178,8 +167,7 @@ public abstract class AbstractTransactionProxyTest extends AbstractTest { doReturn(getSystem()).when(mockActorContext).getActorSystem(); doReturn(getSystem().dispatchers().defaultGlobalDispatcher()).when(mockActorContext).getClientDispatcher(); doReturn(MemberName.forName(memberName)).when(mockActorContext).getCurrentMemberName(); - doReturn(new ShardStrategyFactory(configuration, - LogicalDatastoreType.CONFIGURATION)).when(mockActorContext).getShardStrategyFactory(); + doReturn(new ShardStrategyFactory(configuration)).when(mockActorContext).getShardStrategyFactory(); doReturn(SCHEMA_CONTEXT).when(mockActorContext).getSchemaContext(); doReturn(new Timeout(operationTimeoutInSeconds, TimeUnit.SECONDS)).when(mockActorContext).getOperationTimeout(); doReturn(mockClusterWrapper).when(mockActorContext).getClusterWrapper(); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DatastoreSnapshotRestoreTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DatastoreSnapshotRestoreTest.java index 6a7b17b316..2621d53838 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DatastoreSnapshotRestoreTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DatastoreSnapshotRestoreTest.java @@ -123,7 +123,7 @@ public class DatastoreSnapshotRestoreTest { } private static ShardManagerSnapshot newShardManagerSnapshot(final String... shards) { - return new ShardManagerSnapshot(Arrays.asList(shards), Collections.emptyMap()); + return new ShardManagerSnapshot(Arrays.asList(shards)); } private static Snapshot newSnapshot(final YangInstanceIdentifier path, final NormalizedNode node) throws Exception { diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/persisted/ShardManagerSnapshotTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/persisted/ShardManagerSnapshotTest.java index 26d08e6c5c..998a85f8da 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/persisted/ShardManagerSnapshotTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/persisted/ShardManagerSnapshotTest.java @@ -10,7 +10,6 @@ package org.opendaylight.controller.cluster.datastore.persisted; import static org.junit.Assert.assertEquals; import java.util.Arrays; -import java.util.Collections; import org.apache.commons.lang.SerializationUtils; import org.junit.Test; @@ -24,7 +23,7 @@ public class ShardManagerSnapshotTest { @Test public void testSerialization() { ShardManagerSnapshot expected = - new ShardManagerSnapshot(Arrays.asList("shard1", "shard2"), Collections.emptyMap()); + new ShardManagerSnapshot(Arrays.asList("shard1", "shard2")); ShardManagerSnapshot cloned = (ShardManagerSnapshot) SerializationUtils.clone(expected); assertEquals("getShardList", expected.getShardList(), cloned.getShardList()); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerGetSnapshotReplyActorTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerGetSnapshotReplyActorTest.java index d289e02d44..e68bfe43ac 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerGetSnapshotReplyActorTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerGetSnapshotReplyActorTest.java @@ -45,7 +45,7 @@ public class ShardManagerGetSnapshotReplyActorTest extends AbstractActorTest { TestKit kit = new TestKit(getSystem()); List shardList = Arrays.asList("shard1", "shard2", "shard3"); - ShardManagerSnapshot shardManagerSnapshot = new ShardManagerSnapshot(shardList, Collections.emptyMap()); + ShardManagerSnapshot shardManagerSnapshot = new ShardManagerSnapshot(shardList); ActorRef replyActor = getSystem().actorOf(ShardManagerGetSnapshotReplyActor.props( shardList, "config", shardManagerSnapshot, kit.getRef(), "shard-manager", FiniteDuration.create(100, TimeUnit.SECONDS)), "testSuccess"); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerTest.java index 4417051b09..762108f139 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerTest.java @@ -1399,7 +1399,7 @@ public class ShardManagerTest extends AbstractShardManagerTest { .put("astronauts", Collections.emptyList()).build()); ShardManagerSnapshot snapshot = - new ShardManagerSnapshot(Arrays.asList("shard1", "shard2", "astronauts"), Collections.emptyMap()); + new ShardManagerSnapshot(Arrays.asList("shard1", "shard2", "astronauts")); DatastoreSnapshot restoreFromSnapshot = new DatastoreSnapshot(shardMrgIDSuffix, snapshot, Collections.emptyList()); TestActorRef shardManager = actorFactory.createTestActor(newTestShardMgrBuilder(mockConfig) @@ -1497,7 +1497,7 @@ public class ShardManagerTest extends AbstractShardManagerTest { // persisted. String[] restoredShards = { "default", "people" }; ShardManagerSnapshot snapshot = - new ShardManagerSnapshot(Arrays.asList(restoredShards), Collections.emptyMap()); + new ShardManagerSnapshot(Arrays.asList(restoredShards)); InMemorySnapshotStore.addSnapshot(shardManagerID, snapshot); Uninterruptibles.sleepUninterruptibly(2, TimeUnit.MILLISECONDS); @@ -1924,7 +1924,7 @@ public class ShardManagerTest extends AbstractShardManagerTest { .put("people", Arrays.asList("member-1", "member-2")).build()); String[] restoredShards = {"default", "astronauts"}; ShardManagerSnapshot snapshot = - new ShardManagerSnapshot(Arrays.asList(restoredShards), Collections.emptyMap()); + new ShardManagerSnapshot(Arrays.asList(restoredShards)); InMemorySnapshotStore.addSnapshot("shard-manager-" + shardMrgIDSuffix, snapshot); // create shardManager to come up with restored data diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategyFactoryTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategyFactoryTest.java index 84b82b293a..a7310903a7 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategyFactoryTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/shardstrategy/ShardStrategyFactoryTest.java @@ -17,7 +17,6 @@ import org.junit.Test; import org.opendaylight.controller.cluster.datastore.config.ConfigurationImpl; import org.opendaylight.controller.md.cluster.datastore.model.CarsModel; import org.opendaylight.controller.md.cluster.datastore.model.TestModel; -import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; public class ShardStrategyFactoryTest { @@ -25,8 +24,7 @@ public class ShardStrategyFactoryTest { @Before public void setUp() { - factory = new ShardStrategyFactory(new ConfigurationImpl("module-shards.conf", "modules.conf"), - LogicalDatastoreType.CONFIGURATION); + factory = new ShardStrategyFactory(new ConfigurationImpl("module-shards.conf", "modules.conf")); } @Test diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/utils/MockConfiguration.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/utils/MockConfiguration.java index 76f1ec20f2..ac04688426 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/utils/MockConfiguration.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/utils/MockConfiguration.java @@ -16,8 +16,6 @@ import java.util.stream.Collectors; import org.opendaylight.controller.cluster.access.concepts.MemberName; import org.opendaylight.controller.cluster.datastore.config.ConfigurationImpl; import org.opendaylight.controller.cluster.datastore.config.ModuleConfig; -import org.opendaylight.controller.cluster.datastore.shardstrategy.ShardStrategy; -import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; public class MockConfiguration extends ConfigurationImpl { public MockConfiguration() { @@ -37,9 +35,4 @@ public class MockConfiguration extends ConfigurationImpl { return retMap; }); } - - @Override - public ShardStrategy getStrategyForPrefix(final DOMDataTreeIdentifier prefix) { - return null; - } } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/md/cluster/datastore/model/SchemaContextHelper.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/md/cluster/datastore/model/SchemaContextHelper.java index 0e421b1bc6..378c9089b7 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/md/cluster/datastore/model/SchemaContextHelper.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/md/cluster/datastore/model/SchemaContextHelper.java @@ -44,11 +44,4 @@ public final class SchemaContextHelper { public static EffectiveModelContext select(final String... schemaFiles) { return YangParserTestUtils.parseYangResources(SchemaContextHelper.class, schemaFiles); } - - public static EffectiveModelContext distributedShardedDOMDataTreeSchemaContext() { - // we need prefix-shard-configuration and odl-datastore-test models - // for DistributedShardedDOMDataTree tests - return YangParserTestUtils.parseYangResources(SchemaContextHelper.class, ODL_DATASTORE_TEST_YANG, - "/META-INF/yang/prefix-shard-configuration@2017-01-10.yang"); - } } diff --git a/opendaylight/md-sal/samples/clustering-test-app/model/src/main/yang/odl-mdsal-lowlevel-control.yang b/opendaylight/md-sal/samples/clustering-test-app/model/src/main/yang/odl-mdsal-lowlevel-control.yang index aa2f2da7dd..d81ae06bdf 100644 --- a/opendaylight/md-sal/samples/clustering-test-app/model/src/main/yang/odl-mdsal-lowlevel-control.yang +++ b/opendaylight/md-sal/samples/clustering-test-app/model/src/main/yang/odl-mdsal-lowlevel-control.yang @@ -290,83 +290,6 @@ module odl-mdsal-lowlevel-control { } } - rpc produce-transactions { - description "Upon receiving this, the member shall make sure the outer list item - of llt:in-ints exists for the given id, make sure a shard for - the whole (config) id-ints is created (by creating and closing producer - for the whole id-ints), and create a DOMDataTreeProducer for that item (using that shard). - - FIXME: Is the above the normal way of creating prefix-based chards? - - Then start creating (one by one) and submitting transactions - to randomly add or delete items on the inner list for that id. - To ensure balanced number of deletes, the first write can create - a random set of random numbers. Other writes shall be one per number. - The writes shall use DOMDataTreeProducer API, as opposed to transaction (chains) - created directly on datastore. - .get with a timeout on currently earliest non-complete Future (from .submit) - shall be used as the primary wait method to throttle the submission rate. - This RPC shall not return until all transactions are confirmed successful, - or an exception is raised (the exception should propagate to restconf response). - OptimisticLockException is always considered an error. - In either case, the producer should be closed before returning, - but the shard and the whole id item shall be kept as they are."; - input { - uses llc:id-grouping; - uses transactions-params; - leaf isolated-transactions { - description "The value for DOMDataTreeProducer#createTransaction argument."; - mandatory true; - type boolean; - } - } - output { - uses transactions-result; - } - } - - rpc create-prefix-shard { - description "Upon receiving this, the member creates a prefix shard at the instance-identifier, with replicas - on the required members."; - input { - - leaf prefix { - mandatory true; - type instance-identifier; - } - leaf-list replicas { - min-elements 1; - type string; - } - } - } - - rpc remove-prefix-shard { - description "Upon receiving this, the member removes the prefix based shard identifier by this prefix. - This must be called from the same node that created the shard."; - - input { - leaf prefix { - mandatory true; - type instance-identifier; - } - } - } - - - rpc become-prefix-leader { - description "Upon receiving this, the member shall ask the appropriate API - to become Leader of the given shard (presumably the llt:list-ints one, - created by produce-transactions) and return immediatelly."; - input { - leaf prefix { - mandatory true; - type instance-identifier; - } - } - // No output. - } - rpc remove-shard-replica { description "A specialised copy of cluster-admin:remove-shard-replica. @@ -469,17 +392,6 @@ module odl-mdsal-lowlevel-control { // The following calls are not required for Carbon testing. - rpc deconfigure-id-ints-shard { - description "Upon receiving this, the member shall ask the appropriate API - to remove the llt:id-ints shard (presumably created by produce-transactions) - and return immediatelly. - It is expected the data would move to the root prefix shard seamlessly. - - TODO: Make shard name configurable by input?"; - // No input. - // No output. - } - rpc register-default-constant { description "Upon receiving this, the member has to create and register a default llt:get-contexted-constant implementation (routed RPC). @@ -509,17 +421,4 @@ module odl-mdsal-lowlevel-control { } } } - - rpc shutdown-prefix-shard-replica { - description "Upon receiving this, the member will try to gracefully shutdown local configuration - data store prefix-based shard replica."; - input { - leaf prefix { - description "The prefix of the configuration data store prefix-based shard to be shutdown - gracefully."; - mandatory true; - type instance-identifier; - } - } - } } diff --git a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/MdsalLowLevelTestProvider.java b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/MdsalLowLevelTestProvider.java index dd85b968b7..8e26cb6f95 100644 --- a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/MdsalLowLevelTestProvider.java +++ b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/MdsalLowLevelTestProvider.java @@ -24,7 +24,6 @@ import java.util.concurrent.TimeoutException; import org.opendaylight.controller.cluster.ActorSystemProvider; import org.opendaylight.controller.cluster.datastore.DistributedDataStoreInterface; import org.opendaylight.controller.cluster.datastore.utils.ActorUtils; -import org.opendaylight.controller.cluster.datastore.utils.ClusterUtils; import org.opendaylight.controller.cluster.raft.client.messages.Shutdown; import org.opendaylight.controller.clustering.it.provider.impl.FlappingSingletonService; import org.opendaylight.controller.clustering.it.provider.impl.GetConstantService; @@ -51,20 +50,12 @@ import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvid import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.AddShardReplicaInput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.AddShardReplicaOutput; -import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.BecomePrefixLeaderInput; -import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.BecomePrefixLeaderOutput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.CheckPublishNotificationsInput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.CheckPublishNotificationsOutput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.CheckPublishNotificationsOutputBuilder; -import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.CreatePrefixShardInput; -import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.CreatePrefixShardOutput; -import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.DeconfigureIdIntsShardInput; -import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.DeconfigureIdIntsShardOutput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.IsClientAbortedInput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.IsClientAbortedOutput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.OdlMdsalLowlevelControlService; -import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.ProduceTransactionsInput; -import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.ProduceTransactionsOutput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RegisterBoundConstantInput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RegisterBoundConstantOutput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RegisterBoundConstantOutputBuilder; @@ -79,13 +70,8 @@ import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.l import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RegisterSingletonConstantInput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RegisterSingletonConstantOutput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RegisterSingletonConstantOutputBuilder; -import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RemovePrefixShardInput; -import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RemovePrefixShardOutput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RemoveShardReplicaInput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.RemoveShardReplicaOutput; -import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.ShutdownPrefixShardReplicaInput; -import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.ShutdownPrefixShardReplicaOutput; -import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.ShutdownPrefixShardReplicaOutputBuilder; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.ShutdownShardReplicaInput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.ShutdownShardReplicaOutput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.ShutdownShardReplicaOutputBuilder; @@ -129,7 +115,6 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -277,16 +262,6 @@ public class MdsalLowLevelTestProvider implements OdlMdsalLowlevelControlService return RpcResultBuilder.success(new SubscribeYnlOutputBuilder().build()).buildFuture(); } - @Override - public ListenableFuture> removePrefixShard(final RemovePrefixShardInput input) { - throw new UnsupportedOperationException(); - } - - @Override - public ListenableFuture> becomePrefixLeader( - final BecomePrefixLeaderInput input) { - throw new UnsupportedOperationException(); - } @Override public ListenableFuture> unregisterBoundConstant( @@ -464,17 +439,6 @@ public class MdsalLowLevelTestProvider implements OdlMdsalLowlevelControlService } } - @Override - public ListenableFuture> createPrefixShard(final CreatePrefixShardInput input) { - throw new UnsupportedOperationException(); - } - - @Override - public ListenableFuture> deconfigureIdIntsShard( - final DeconfigureIdIntsShardInput input) { - return null; - } - @Override public ListenableFuture> unsubscribeYnl(final UnsubscribeYnlInput input) { LOG.info("In unsubscribeYnl - input: {}", input); @@ -518,12 +482,6 @@ public class MdsalLowLevelTestProvider implements OdlMdsalLowlevelControlService return RpcResultBuilder.success(output).buildFuture(); } - @Override - public ListenableFuture> produceTransactions( - final ProduceTransactionsInput input) { - throw new UnsupportedOperationException(); - } - @Override public ListenableFuture> shutdownShardReplica( final ShutdownShardReplicaInput input) { @@ -538,24 +496,6 @@ public class MdsalLowLevelTestProvider implements OdlMdsalLowlevelControlService return shutdownShardGracefully(shardName, new ShutdownShardReplicaOutputBuilder().build()); } - @Override - public ListenableFuture> shutdownPrefixShardReplica( - final ShutdownPrefixShardReplicaInput input) { - LOG.info("shutdownPrefixShardReplica - input: {}", input); - - final InstanceIdentifier shardPrefix = input.getPrefix(); - - if (shardPrefix == null) { - return RpcResultBuilder.failed().withError(ErrorType.RPC, "bad-element", - "A valid shard prefix must be specified").buildFuture(); - } - - final YangInstanceIdentifier shardPath = bindingNormalizedNodeSerializer.toYangInstanceIdentifier(shardPrefix); - final String cleanPrefixShardName = ClusterUtils.getCleanShardName(shardPath); - - return shutdownShardGracefully(cleanPrefixShardName, new ShutdownPrefixShardReplicaOutputBuilder().build()); - } - private SettableFuture> shutdownShardGracefully(final String shardName, final T success) { final SettableFuture> rpcResult = SettableFuture.create(); final ActorUtils context = configDataStore.getActorUtils();