X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FDataTreeChangeListenerSupport.java;h=4281bfe796afd1e1844286b4ae854aa57de8dab8;hb=30507b196fa240a4176ba12102ac0469280feff9;hp=afce4df546febce2dd122b1eb431896855503ca8;hpb=8f0395b38dbfdf6b3164cb68b1cba651b1075a07;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeChangeListenerSupport.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeChangeListenerSupport.java index afce4df546..4281bfe796 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeChangeListenerSupport.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeChangeListenerSupport.java @@ -9,29 +9,30 @@ package org.opendaylight.controller.cluster.datastore; import akka.actor.ActorRef; import akka.actor.ActorSelection; -import com.google.common.base.Preconditions; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.Map.Entry; import org.opendaylight.controller.cluster.datastore.messages.EnableNotification; import org.opendaylight.controller.cluster.datastore.messages.RegisterDataTreeChangeListener; import org.opendaylight.controller.cluster.datastore.messages.RegisterDataTreeChangeListenerReply; import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener; import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class DataTreeChangeListenerSupport extends LeaderLocalDelegateFactory> { +final class DataTreeChangeListenerSupport extends LeaderLocalDelegateFactory, DataTreeCandidate> { private static final Logger LOG = LoggerFactory.getLogger(DataTreeChangeListenerSupport.class); private final ArrayList delayedRegistrations = new ArrayList<>(); private final Collection actors = new ArrayList<>(); - private final Shard shard; DataTreeChangeListenerSupport(final Shard shard) { - this.shard = Preconditions.checkNotNull(shard); + super(shard); } @Override - void onLeadershipChange(final boolean isLeader) { + void onLeadershipChange(final boolean isLeader, boolean hasLeader) { if (isLeader) { for (DelayedDataTreeListenerRegistration reg : delayedRegistrations) { reg.createDelegate(this); @@ -42,44 +43,49 @@ final class DataTreeChangeListenerSupport extends LeaderLocalDelegateFactory registration; + final DataTreeCandidate event; if (!isLeader) { - LOG.debug("{}: Shard is not the leader - delaying registration", shard.persistenceId()); + LOG.debug("{}: Shard is not the leader - delaying registration", persistenceId()); DelayedDataTreeListenerRegistration delayedReg = new DelayedDataTreeListenerRegistration(registerTreeChangeListener); delayedRegistrations.add(delayedReg); registration = delayedReg; + event = null; } else { - registration = createDelegate(registerTreeChangeListener); + final Entry, DataTreeCandidate> res = createDelegate(registerTreeChangeListener); + registration = res.getKey(); + event = res.getValue(); } - ActorRef listenerRegistration = shard.getContext().actorOf( - DataTreeChangeListenerRegistrationActor.props(registration)); + ActorRef listenerRegistration = createActor(DataTreeChangeListenerRegistrationActor.props(registration)); LOG.debug("{}: registerDataChangeListener sending reply, listenerRegistrationPath = {} ", - shard.persistenceId(), listenerRegistration.path()); + persistenceId(), listenerRegistration.path()); - shard.getSender().tell(new RegisterDataTreeChangeListenerReply(listenerRegistration), shard.getSelf()); + tellSender(new RegisterDataTreeChangeListenerReply(listenerRegistration)); + if (event != null) { + registration.getInstance().onDataTreeChanged(Collections.singletonList(event)); + } } @Override - ListenerRegistration createDelegate(final RegisterDataTreeChangeListener message) { - ActorSelection dataChangeListenerPath = shard.getContext().system().actorSelection( - message.getDataTreeChangeListenerPath().path()); + Entry, DataTreeCandidate> createDelegate(final RegisterDataTreeChangeListener message) { + ActorSelection dataChangeListenerPath = selectActor(message.getDataTreeChangeListenerPath()); // Notify the listener if notifications should be enabled or not // If this shard is the leader then it will enable notifications else // it will not - dataChangeListenerPath.tell(new EnableNotification(true), shard.getSelf()); + dataChangeListenerPath.tell(new EnableNotification(true), getSelf()); // Now store a reference to the data change listener so it can be notified // at a later point if notifications should be enabled or disabled @@ -87,8 +93,8 @@ final class DataTreeChangeListenerSupport extends LeaderLocalDelegateFactory