X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FDataChangeListenerSupport.java;h=fde1bf691484b35231608d552af56da88a557631;hp=e6f63d7154ba6d5f301ed7fd4b77f111d0ea8034;hb=6aaf954c5d7d3834e5ac06964707aa7ce0c19b1d;hpb=cac7138ddd81d1cc801d4b6cd9bc4372e0a8ddd3 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..fde1bf6914 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,105 +9,43 @@ package org.opendaylight.controller.cluster.datastore; import akka.actor.ActorRef; import akka.actor.ActorSelection; -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.actors.DataTreeNotificationListenerRegistrationActor; 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.yangtools.concepts.ListenerRegistration; 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; -final class DataChangeListenerSupport extends LeaderLocalDelegateFactory>>, DOMImmutableDataChangeEvent> { - private static final Logger LOG = LoggerFactory.getLogger(DataChangeListenerSupport.class); - private final List delayedListenerRegistrations = new ArrayList<>(); - private final List dataChangeListeners = new ArrayList<>(); +final class DataChangeListenerSupport extends AbstractDataListenerSupport< + AsyncDataChangeListener>, RegisterChangeListener> { DataChangeListenerSupport(final Shard shard) { super(shard); } @Override - void onLeadershipChange(final boolean isLeader) { - for (ActorSelection dataChangeListener : dataChangeListeners) { - dataChangeListener.tell(new EnableNotification(isLeader), getSelf()); - } + void doRegistration(final RegisterChangeListener message, final ActorRef registrationActor) { + final ActorSelection listenerActor = processListenerRegistrationMessage(message); - 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()); - } - } - } + AsyncDataChangeListener> listener = + new DataChangeListenerProxy(listenerActor); + + log().debug("{}: Registering for path {}", persistenceId(), message.getPath()); - delayedListenerRegistrations.clear(); - } + final ShardDataTree shardDataTree = getShard().getDataStore(); + shardDataTree.registerDataChangeListener(message.getPath(), listener, message.getScope(), + shardDataTree.readCurrentData(), registration -> registrationActor.tell( + new DataTreeNotificationListenerRegistrationActor.SetRegistration(registration, () -> + removeListenerActor(listenerActor)), ActorRef.noSender())); } @Override - void onMessage(final RegisterChangeListener message, final boolean isLeader) { - - LOG.debug("{}: registerDataChangeListener for {}, leader: {}", persistenceId(), message.getPath(), isLeader); - - final ListenerRegistration>> registration; - final AsyncDataChangeEvent> event; - if (isLeader) { - final Entry>>, DOMImmutableDataChangeEvent> res = - createDelegate(message); - registration = res.getKey(); - event = res.getValue(); - } else { - LOG.debug("{}: Shard is not the leader - delaying registration", persistenceId()); - - DelayedListenerRegistration delayedReg = new DelayedListenerRegistration(message); - delayedListenerRegistrations.add(delayedReg); - registration = delayedReg; - event = null; - } - - ActorRef listenerRegistration = createActor(DataChangeListenerRegistration.props(registration)); - - LOG.debug("{}: registerDataChangeListener sending reply, listenerRegistrationPath = {} ", - persistenceId(), listenerRegistration.path()); - - tellSender(new RegisterChangeListenerReply(listenerRegistration)); - if (event != null) { - registration.getInstance().onDataChanged(event); - } + protected Object newRegistrationReplyMessage(ActorRef registrationActor) { + return new RegisterChangeListenerReply(registrationActor); } @Override - Entry>>, DOMImmutableDataChangeEvent> createDelegate( - final RegisterChangeListener message) { - ActorSelection dataChangeListenerPath = selectActor(message.getDataChangeListenerPath()); - - // 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), 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 - dataChangeListeners.add(dataChangeListenerPath); - - AsyncDataChangeListener> listener = - new DataChangeListenerProxy(dataChangeListenerPath); - - LOG.debug("{}: Registering for path {}", persistenceId(), message.getPath()); - - return getShard().getDataStore().registerChangeListener(message.getPath(), listener, - message.getScope()); + protected String logName() { + return "registerDataChangeListener"; } }