* 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.sharding;
import static akka.actor.ActorRef.noSender;
+import static java.util.Objects.requireNonNull;
import static org.opendaylight.controller.cluster.datastore.utils.ClusterUtils.SHARD_PREFIX_QNAME;
import static org.opendaylight.controller.cluster.datastore.utils.ClusterUtils.SHARD_REPLICAS_QNAME;
import static org.opendaylight.controller.cluster.datastore.utils.ClusterUtils.SHARD_REPLICA_QNAME;
import akka.actor.ActorRef;
-import com.google.common.base.Preconditions;
import java.util.Collection;
import java.util.EnumMap;
import java.util.List;
import java.util.stream.Collectors;
-import javax.annotation.Nonnull;
import org.opendaylight.controller.cluster.access.concepts.MemberName;
-import org.opendaylight.controller.cluster.datastore.AbstractDataStore;
+import org.opendaylight.controller.cluster.datastore.DistributedDataStoreInterface;
import org.opendaylight.controller.cluster.datastore.config.PrefixShardConfiguration;
import org.opendaylight.controller.cluster.datastore.shardstrategy.PrefixShardStrategy;
import org.opendaylight.controller.cluster.datastore.utils.ClusterUtils;
import org.opendaylight.controller.cluster.sharding.messages.PrefixShardCreated;
import org.opendaylight.controller.cluster.sharding.messages.PrefixShardRemoved;
-import org.opendaylight.controller.md.sal.dom.api.ClusteredDOMDataTreeChangeListener;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener;
import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
private final ActorRef handlingActor;
private final MemberName memberName;
- private final EnumMap<LogicalDatastoreType,
- ListenerRegistration<org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener>> registrations =
+ private final EnumMap<LogicalDatastoreType,ListenerRegistration<DOMDataTreeChangeListener>> registrations =
new EnumMap<>(LogicalDatastoreType.class);
public PrefixedShardConfigUpdateHandler(final ActorRef handlingActor, final MemberName memberName) {
- this.handlingActor = Preconditions.checkNotNull(handlingActor);
- this.memberName = Preconditions.checkNotNull(memberName);
+ this.handlingActor = requireNonNull(handlingActor);
+ this.memberName = requireNonNull(memberName);
}
- public void initListener(final AbstractDataStore dataStore, final LogicalDatastoreType type) {
+ public void initListener(final DistributedDataStoreInterface dataStore, final LogicalDatastoreType type) {
registrations.put(type, dataStore.registerShardConfigListener(
ClusterUtils.SHARD_LIST_PATH, new ShardConfigHandler(memberName, type, handlingActor)));
}
private final MemberName memberName;
private final LogicalDatastoreType type;
private final ActorRef handlingActor;
+ private final String logName;
public ShardConfigHandler(final MemberName memberName,
final LogicalDatastoreType type,
this.memberName = memberName;
this.type = type;
this.handlingActor = handlingActor;
+ logName = memberName.getName() + "-" + type;
}
@Override
- public void onDataTreeChanged(@Nonnull final Collection<DataTreeCandidate> changes) {
+ public void onDataTreeChanged(final Collection<DataTreeCandidate> changes) {
changes.forEach(this::resolveChange);
}
switch (candidate.getRootNode().getModificationType()) {
case UNMODIFIED:
break;
- case SUBTREE_MODIFIED:
case APPEARED:
- case WRITE:
- resolveWrite(candidate.getRootNode());
- break;
case DELETE:
case DISAPPEARED:
- resolveDelete(candidate.getRootNode());
+ case SUBTREE_MODIFIED:
+ case WRITE:
+ resolveModifiedRoot(candidate.getRootNode());
break;
default:
break;
}
}
- private void resolveWrite(final DataTreeCandidateNode rootNode) {
+ private void resolveModifiedRoot(final DataTreeCandidateNode rootNode) {
- LOG.debug("{}: New config received {}", memberName, rootNode);
- LOG.debug("{}: Data after: {}", memberName, rootNode.getDataAfter());
+ LOG.debug("{}: New config received {}", logName, rootNode);
+ LOG.debug("{}: Data after: {}", logName, rootNode.getDataAfter());
// were in the shards list, iter children and resolve
for (final DataTreeCandidateNode childNode : rootNode.getChildNodes()) {
}
}
+ @SuppressWarnings("unchecked")
private void resolveWrittenShard(final DataTreeCandidateNode childNode) {
final MapEntryNode entryNode = (MapEntryNode) childNode.getDataAfter().get();
final LeafNode<YangInstanceIdentifier> prefix =
final YangInstanceIdentifier identifier = prefix.getValue();
- LOG.debug("{}: Deserialized {} from datastore", memberName, identifier);
+ LOG.debug("{}: Deserialized {} from datastore", logName, identifier);
final ContainerNode replicas =
(ContainerNode) entryNode.getChild(new NodeIdentifier(SHARD_REPLICAS_QNAME)).get();
.map(child -> MemberName.forName(child.getValue()))
.collect(Collectors.toList());
- LOG.debug("{}: Replicas read from ds {}", memberName, retReplicas.toString());
+ LOG.debug("{}: Replicas read from ds {}", logName, retReplicas.toString());
final PrefixShardConfiguration newConfig =
new PrefixShardConfiguration(new DOMDataTreeIdentifier(type, identifier),
PrefixShardStrategy.NAME, retReplicas);
- LOG.debug("{}: Resulting config {}", memberName, newConfig);
+ LOG.debug("{}: Resulting config {} - sending PrefixShardCreated to {}", logName, newConfig, handlingActor);
handlingActor.tell(new PrefixShardCreated(newConfig), noSender());
}
handlingActor.tell(message, noSender());
}
- private void resolveDelete(final DataTreeCandidateNode rootNode) {
-
+ @Override
+ public String toString() {
+ return "ShardConfigHandler [logName=" + logName + ", handlingActor=" + handlingActor + "]";
}
}
}