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=f4b6bcc9fd56801a2ea077151a947627e2099595;hp=05accddb7885625a89d93d4bc8936bf763c267b1;hb=6050fd28f2def659abb5bc9d7127eb748b5fb32a;hpb=d9ea4400df226eb65c964ab0cb2aa81ee495ba15 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 05accddb78..f4b6bcc9fd 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 @@ -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.List; import java.util.Map.Entry; import org.opendaylight.controller.cluster.datastore.messages.EnableNotification; import org.opendaylight.controller.cluster.datastore.messages.RegisterChangeListener; @@ -22,88 +20,16 @@ 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>>, - 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<>(); +final class DataChangeListenerSupport extends AbstractDataListenerSupport< + AsyncDataChangeListener>, RegisterChangeListener, + DelayedDataChangeListenerRegistration, DataChangeListenerRegistration< + AsyncDataChangeListener>>> { DataChangeListenerSupport(final Shard shard) { super(shard); } - @Override - 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) { - 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, boolean hasLeader) { - - LOG.debug("{}: registerDataChangeListener for {}, isLeader: {}, hasLeader : {}", - persistenceId(), message.getPath(), isLeader, hasLeader); - - final ListenerRegistration>> registration; - if ((hasLeader && message.isRegisterOnAllInstances()) || isLeader) { - final Entry>>, - Optional> res = createDelegate(message); - registration = res.getKey(); - - getShard().getDataStore().notifyOfInitialData(res.getKey(), res.getValue()); - } else { - LOG.debug("{}: Shard is not the leader - delaying registration", persistenceId()); - - DelayedListenerRegistration delayedReg = new DelayedListenerRegistration(message); - if(message.isRegisterOnAllInstances()) { - delayedRegisterOnAllListeners.add(delayedReg); - } else { - delayedListenerRegistrations.add(delayedReg); - } - registration = delayedReg; - } - - ActorRef listenerRegistration = createActor(DataChangeListenerRegistrationActor.props(registration)); - - LOG.debug("{}: registerDataChangeListener sending reply, listenerRegistrationPath = {} ", - persistenceId(), listenerRegistration.path()); - - tellSender(new RegisterChangeListenerReply(listenerRegistration)); - } - @Override Entry>>, Optional> createDelegate(final RegisterChangeListener message) { @@ -117,15 +43,41 @@ final class DataChangeListenerSupport extends LeaderLocalDelegateFactory> listener = new DataChangeListenerProxy(dataChangeListenerPath); - LOG.debug("{}: Registering for path {}", persistenceId(), message.getPath()); + log().debug("{}: Registering for path {}", persistenceId(), message.getPath()); - return getShard().getDataStore().registerChangeListener(message.getPath(), listener, - message.getScope()); + Entry>>, + Optional> regEntry = getShard().getDataStore().registerChangeListener( + message.getPath(), listener, message.getScope()); + + getShard().getDataStore().notifyOfInitialData(regEntry.getKey(), regEntry.getValue()); + + return regEntry; + } + + @Override + protected DelayedDataChangeListenerRegistration newDelayedListenerRegistration(RegisterChangeListener message) { + return new DelayedDataChangeListenerRegistration(message); + } + + @Override + protected ActorRef newRegistrationActor( + ListenerRegistration>> registration) { + return createActor(DataChangeListenerRegistrationActor.props(registration)); + } + + @Override + protected Object newRegistrationReplyMessage(ActorRef registrationActor) { + return new RegisterChangeListenerReply(registrationActor); + } + + @Override + protected String logName() { + return "registerDataChangeListener"; } }