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=fa55523db0087467d4919075cbc39abc2a46621b;hb=bb1891e328feee08ccd29c96034e967f1eeccece;hp=76458fd8edd1471a87cf278d66f4e9d000c26d61;hpb=d9ea4400df226eb65c964ab0cb2aa81ee495ba15;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 76458fd8ed..fa55523db0 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 @@ -10,8 +10,6 @@ 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.Collection; import java.util.Map.Entry; import org.opendaylight.controller.cluster.datastore.messages.EnableNotification; import org.opendaylight.controller.cluster.datastore.messages.RegisterDataTreeChangeListener; @@ -19,65 +17,16 @@ import org.opendaylight.controller.cluster.datastore.messages.RegisterDataTreeCh 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, Optional> { - private static final Logger LOG = LoggerFactory.getLogger(DataTreeChangeListenerSupport.class); - private final ArrayList delayedRegistrations = new ArrayList<>(); - private final Collection actors = new ArrayList<>(); +final class DataTreeChangeListenerSupport extends AbstractDataListenerSupport> { DataTreeChangeListenerSupport(final Shard shard) { super(shard); } @Override - void onLeadershipChange(final boolean isLeader, boolean hasLeader) { - final EnableNotification msg = new EnableNotification(isLeader); - for (ActorSelection dataChangeListener : actors) { - dataChangeListener.tell(msg, getSelf()); - } - - if (isLeader) { - for (DelayedDataTreeListenerRegistration reg : delayedRegistrations) { - reg.createDelegate(this); - } - delayedRegistrations.clear(); - delayedRegistrations.trimToSize(); - } - } - - @Override - void onMessage(final RegisterDataTreeChangeListener registerTreeChangeListener, final boolean isLeader, boolean hasLeader) { - LOG.debug("{}: registerTreeChangeListener for {}, leader: {}", persistenceId(), registerTreeChangeListener.getPath(), isLeader); - - final ListenerRegistration registration; - if (!isLeader) { - LOG.debug("{}: Shard is not the leader - delaying registration", persistenceId()); - - DelayedDataTreeListenerRegistration delayedReg = - new DelayedDataTreeListenerRegistration(registerTreeChangeListener); - delayedRegistrations.add(delayedReg); - registration = delayedReg; - } else { - final Entry, Optional> res = - createDelegate(registerTreeChangeListener); - registration = res.getKey(); - getShard().getDataStore().notifyOfInitialData(registerTreeChangeListener.getPath(), - registration.getInstance(), res.getValue()); - } - - ActorRef listenerRegistration = createActor(DataTreeChangeListenerRegistrationActor.props(registration)); - - LOG.debug("{}: registerDataChangeListener sending reply, listenerRegistrationPath = {} ", - persistenceId(), listenerRegistration.path()); - - tellSender(new RegisterDataTreeChangeListenerReply(listenerRegistration)); - } - - @Override - Entry, Optional> createDelegate(final RegisterDataTreeChangeListener message) { + Entry, Optional> createDelegate( + final RegisterDataTreeChangeListener message) { ActorSelection dataChangeListenerPath = selectActor(message.getDataTreeChangeListenerPath()); // Notify the listener if notifications should be enabled or not @@ -87,12 +36,40 @@ final class DataTreeChangeListenerSupport extends LeaderLocalDelegateFactory, Optional> regEntry = + getShard().getDataStore().registerTreeChangeListener(message.getPath(), listener); + + getShard().getDataStore().notifyOfInitialData(message.getPath(), + regEntry.getKey().getInstance(), regEntry.getValue()); + + return regEntry; + } + + @Override + protected DelayedDataTreeListenerRegistration newDelayedListenerRegistration(RegisterDataTreeChangeListener message) { + return new DelayedDataTreeListenerRegistration(message); + } - return getShard().getDataStore().registerTreeChangeListener(message.getPath(), listener); + @Override + protected ActorRef newRegistrationActor(ListenerRegistration registration) { + return createActor(DataTreeChangeListenerRegistrationActor.props(registration)); + } + + @Override + protected Object newRegistrationReplyMessage(ActorRef registrationActor) { + return new RegisterDataTreeChangeListenerReply(registrationActor); + } + + @Override + protected String logName() { + return "registerTreeChangeListener"; } }