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%2FDistributedDataStore.java;h=5195a2f918c6248463e26663b953378948c8e0dc;hb=05193e1f77cb4f1be9a58b946cd11e619c10bb8c;hp=c780881a2ffad1ed50695b7a38111068ec2f8e3f;hpb=7e19c2f4d2695cc4d077a1f5882089d8af923696;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStore.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStore.java index c780881a2f..5195a2f918 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStore.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DistributedDataStore.java @@ -12,6 +12,7 @@ import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.dispatch.OnComplete; import akka.util.Timeout; +import com.google.common.base.Optional; import com.google.common.base.Preconditions; import org.opendaylight.controller.cluster.datastore.identifiers.ShardManagerIdentifier; import org.opendaylight.controller.cluster.datastore.messages.RegisterChangeListener; @@ -76,44 +77,44 @@ public class DistributedDataStore implements DOMStore, SchemaContextListener, Au Preconditions.checkNotNull(path, "path should not be null"); Preconditions.checkNotNull(listener, "listener should not be null"); - if(LOG.isDebugEnabled()) { - LOG.debug("Registering listener: {} for path: {} scope: {}", listener, path, scope); - } - ActorRef dataChangeListenerActor = actorContext.getActorSystem().actorOf( - DataChangeListener.props(listener )); + + LOG.debug("Registering listener: {} for path: {} scope: {}", listener, path, scope); String shardName = ShardStrategyFactory.getStrategy(path).findShard(path); - Future future = actorContext.executeLocalShardOperationAsync(shardName, - new RegisterChangeListener(path, dataChangeListenerActor.path(), scope), - new Timeout(actorContext.getOperationDuration().$times( - REGISTER_DATA_CHANGE_LISTENER_TIMEOUT_FACTOR))); + Optional shard = actorContext.findLocalShard(shardName); - if (future != null) { - final DataChangeListenerRegistrationProxy listenerRegistrationProxy = + //if shard is NOT local + if (!shard.isPresent()) { + LOG.debug("No local shard for shardName {} was found so returning a noop registration", shardName); + return new NoOpDataChangeListenerRegistration(listener); + } + //if shard is local + ActorRef dataChangeListenerActor = actorContext.getActorSystem().actorOf(DataChangeListener.props(listener)); + Future future = actorContext.executeOperationAsync(shard.get(), + new RegisterChangeListener(path, dataChangeListenerActor.path(), scope), + new Timeout(actorContext.getOperationDuration().$times(REGISTER_DATA_CHANGE_LISTENER_TIMEOUT_FACTOR))); + + final DataChangeListenerRegistrationProxy listenerRegistrationProxy = new DataChangeListenerRegistrationProxy(listener, dataChangeListenerActor); - future.onComplete(new OnComplete(){ + future.onComplete(new OnComplete() { - @Override public void onComplete(Throwable failure, Object result) + @Override + public void onComplete(Throwable failure, Object result) throws Throwable { - if(failure != null){ - LOG.error("Failed to register listener at path " + path.toString(), failure); - return; - } - RegisterChangeListenerReply reply = (RegisterChangeListenerReply) result; - listenerRegistrationProxy.setListenerRegistrationActor(actorContext - .actorSelection(reply.getListenerRegistrationPath())); + if (failure != null) { + LOG.error("Failed to register listener at path " + path.toString(), failure); + return; } - }, actorContext.getActorSystem().dispatcher()); - return listenerRegistrationProxy; - } - if(LOG.isDebugEnabled()) { - LOG.debug( - "No local shard for shardName {} was found so returning a noop registration", - shardName); - } - return new NoOpDataChangeListenerRegistration(listener); + RegisterChangeListenerReply reply = (RegisterChangeListenerReply) result; + listenerRegistrationProxy.setListenerRegistrationActor(actorContext + .actorSelection(reply.getListenerRegistrationPath())); + } + }, actorContext.getActorSystem().dispatcher()); + + return listenerRegistrationProxy; + } @Override