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%2FDataChangeListenerSupport.java;h=05accddb7885625a89d93d4bc8936bf763c267b1;hb=refs%2Fchanges%2F49%2F26949%2F2;hp=e6f63d7154ba6d5f301ed7fd4b77f111d0ea8034;hpb=3d460a8bcbc24eeb969319feb9c7bf16bff496c1;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerSupport.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerSupport.java index e6f63d7154..05accddb78 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerSupport.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerSupport.java @@ -9,88 +9,104 @@ package org.opendaylight.controller.cluster.datastore; import akka.actor.ActorRef; import akka.actor.ActorSelection; +import com.google.common.base.Optional; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; import org.opendaylight.controller.cluster.datastore.messages.EnableNotification; import org.opendaylight.controller.cluster.datastore.messages.RegisterChangeListener; import org.opendaylight.controller.cluster.datastore.messages.RegisterChangeListenerReply; -import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener; -import org.opendaylight.controller.md.sal.dom.store.impl.DOMImmutableDataChangeEvent; +import org.opendaylight.controller.md.sal.dom.store.impl.DataChangeListenerRegistration; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class DataChangeListenerSupport extends LeaderLocalDelegateFactory>>, DOMImmutableDataChangeEvent> { +final class DataChangeListenerSupport extends LeaderLocalDelegateFactory>>, + Optional> { private static final Logger LOG = LoggerFactory.getLogger(DataChangeListenerSupport.class); private final List delayedListenerRegistrations = new ArrayList<>(); private final List dataChangeListeners = new ArrayList<>(); + private final List delayedRegisterOnAllListeners = new ArrayList<>(); DataChangeListenerSupport(final Shard shard) { super(shard); } @Override - void onLeadershipChange(final boolean isLeader) { + void onLeadershipChange(final boolean isLeader, boolean hasLeader) { + LOG.debug("onLeadershipChange, isLeader: {}, hasLeader : {}", isLeader, hasLeader); + for (ActorSelection dataChangeListener : dataChangeListeners) { dataChangeListener.tell(new EnableNotification(isLeader), getSelf()); } + if(hasLeader) { + for (DelayedListenerRegistration reg : delayedRegisterOnAllListeners) { + registerDelayedListeners(reg); + } + delayedRegisterOnAllListeners.clear(); + } + if (isLeader) { for (DelayedListenerRegistration reg: delayedListenerRegistrations) { - if(!reg.isClosed()) { - final Entry>>, DOMImmutableDataChangeEvent> res = - createDelegate(reg.getRegisterChangeListener()); - reg.setDelegate(res.getKey()); - if (res.getValue() != null) { - reg.getInstance().onDataChanged(res.getValue()); - } - } + registerDelayedListeners(reg); } delayedListenerRegistrations.clear(); } } + private void registerDelayedListeners(DelayedListenerRegistration reg) { + if(!reg.isClosed()) { + final Entry>>, + Optional> res = createDelegate(reg.getRegisterChangeListener()); + reg.setDelegate(res.getKey()); + getShard().getDataStore().notifyOfInitialData(res.getKey(), res.getValue()); + } + } + @Override - void onMessage(final RegisterChangeListener message, final boolean isLeader) { + void onMessage(final RegisterChangeListener message, final boolean isLeader, boolean hasLeader) { - LOG.debug("{}: registerDataChangeListener for {}, leader: {}", persistenceId(), message.getPath(), isLeader); + LOG.debug("{}: registerDataChangeListener for {}, isLeader: {}, hasLeader : {}", + persistenceId(), message.getPath(), isLeader, hasLeader); final ListenerRegistration>> registration; - final AsyncDataChangeEvent> event; - if (isLeader) { - final Entry>>, DOMImmutableDataChangeEvent> res = - createDelegate(message); + if ((hasLeader && message.isRegisterOnAllInstances()) || isLeader) { + final Entry>>, + Optional> res = createDelegate(message); registration = res.getKey(); - event = res.getValue(); + + getShard().getDataStore().notifyOfInitialData(res.getKey(), res.getValue()); } else { LOG.debug("{}: Shard is not the leader - delaying registration", persistenceId()); DelayedListenerRegistration delayedReg = new DelayedListenerRegistration(message); - delayedListenerRegistrations.add(delayedReg); + if(message.isRegisterOnAllInstances()) { + delayedRegisterOnAllListeners.add(delayedReg); + } else { + delayedListenerRegistrations.add(delayedReg); + } registration = delayedReg; - event = null; } - ActorRef listenerRegistration = createActor(DataChangeListenerRegistration.props(registration)); + ActorRef listenerRegistration = createActor(DataChangeListenerRegistrationActor.props(registration)); LOG.debug("{}: registerDataChangeListener sending reply, listenerRegistrationPath = {} ", persistenceId(), listenerRegistration.path()); tellSender(new RegisterChangeListenerReply(listenerRegistration)); - if (event != null) { - registration.getInstance().onDataChanged(event); - } } @Override - Entry>>, DOMImmutableDataChangeEvent> createDelegate( - final RegisterChangeListener message) { + Entry>>, + Optional> createDelegate(final RegisterChangeListener message) { ActorSelection dataChangeListenerPath = selectActor(message.getDataChangeListenerPath()); // Notify the listener if notifications should be enabled or not @@ -100,7 +116,9 @@ final class DataChangeListenerSupport extends LeaderLocalDelegateFactory> listener = new DataChangeListenerProxy(dataChangeListenerPath);