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%2FDataChangeListenerRegistrationProxy.java;h=acf630e2e95598e71fdbd786da628f3524a29408;hb=8de365b86ee7b65ee201166be85142b27ffd7295;hp=89cc9695251d18b2efc747b0de2b2882431a8de5;hpb=b2e6c299fad844633c8b40a2e180780f5774a4ae;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerRegistrationProxy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerRegistrationProxy.java index 89cc969525..acf630e2e9 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerRegistrationProxy.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerRegistrationProxy.java @@ -8,11 +8,13 @@ package org.opendaylight.controller.cluster.datastore; +import akka.actor.ActorRef; import akka.actor.ActorSelection; +import akka.actor.PoisonPill; import org.opendaylight.controller.cluster.datastore.messages.CloseDataChangeListenerRegistration; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener; import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; /** @@ -23,15 +25,24 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; *

*/ public class DataChangeListenerRegistrationProxy implements ListenerRegistration { - private final ActorSelection listenerRegistrationActor; + private volatile ActorSelection listenerRegistrationActor; private final AsyncDataChangeListener listener; + private final ActorRef dataChangeListenerActor; + private boolean closed = false; - public >> + public >> DataChangeListenerRegistrationProxy( ActorSelection listenerRegistrationActor, - L listener) { + L listener, ActorRef dataChangeListenerActor) { this.listenerRegistrationActor = listenerRegistrationActor; this.listener = listener; + this.dataChangeListenerActor = dataChangeListenerActor; + } + + public >> + DataChangeListenerRegistrationProxy( + L listener, ActorRef dataChangeListenerActor) { + this(null, listener, dataChangeListenerActor); } @Override @@ -39,8 +50,40 @@ public class DataChangeListenerRegistrationProxy implements ListenerRegistration return listener; } + public void setListenerRegistrationActor(ActorSelection listenerRegistrationActor) { + boolean sendCloseMessage = false; + synchronized(this) { + if(closed) { + sendCloseMessage = true; + } else { + this.listenerRegistrationActor = listenerRegistrationActor; + } + } + if(sendCloseMessage) { + listenerRegistrationActor.tell(new + CloseDataChangeListenerRegistration().toSerializable(), null); + } + + this.listenerRegistrationActor = listenerRegistrationActor; + } + + public ActorSelection getListenerRegistrationActor() { + return listenerRegistrationActor; + } + @Override public void close() { - listenerRegistrationActor.tell(new CloseDataChangeListenerRegistration(), null); + + boolean sendCloseMessage; + synchronized(this) { + sendCloseMessage = !closed && listenerRegistrationActor != null; + closed = true; + } + if(sendCloseMessage) { + listenerRegistrationActor.tell(new + CloseDataChangeListenerRegistration().toSerializable(), null); + } + + dataChangeListenerActor.tell(PoisonPill.getInstance(), null); } }