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%2FDataChangeListenerRegistrationProxy.java;h=acf630e2e95598e71fdbd786da628f3524a29408;hp=83737cfac5b4133d051839f2a1b4b29245f80f80;hb=9f61e98b036119694dfef0759a7cafc56aae6e86;hpb=cbe83ca3074fa0182d4f079f528bb710a997ced7 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 83737cfac5..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 @@ -14,7 +14,7 @@ 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; /** @@ -25,11 +25,12 @@ 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, ActorRef dataChangeListenerActor) { @@ -38,14 +39,51 @@ public class DataChangeListenerRegistrationProxy implements ListenerRegistration this.dataChangeListenerActor = dataChangeListenerActor; } + public >> + DataChangeListenerRegistrationProxy( + L listener, ActorRef dataChangeListenerActor) { + this(null, listener, dataChangeListenerActor); + } + @Override public Object getInstance() { 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); } }