Bump odlparent to 6.0.0
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / entityownership / DistributedEntityOwnershipService.java
index 8eb69daf096321af6672b43264972a928eed55f8..ca9ef6338d2b769a7e9d6d57f2a7143ca4699ecb 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.controller.cluster.datastore.entityownership;
 
+import static java.util.Objects.requireNonNull;
 import static org.opendaylight.controller.cluster.datastore.entityownership.EntityOwnersModel.CANDIDATE_NODE_ID;
 import static org.opendaylight.controller.cluster.datastore.entityownership.EntityOwnersModel.ENTITY_OWNER_NODE_ID;
 import static org.opendaylight.controller.cluster.datastore.entityownership.EntityOwnersModel.entityPath;
@@ -16,13 +17,14 @@ import akka.dispatch.OnComplete;
 import akka.pattern.Patterns;
 import akka.util.Timeout;
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.Collection;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import org.opendaylight.controller.cluster.access.concepts.MemberName;
 import org.opendaylight.controller.cluster.datastore.config.Configuration;
 import org.opendaylight.controller.cluster.datastore.config.ModuleShardConfiguration;
@@ -74,7 +76,7 @@ public class DistributedEntityOwnershipService implements DOMEntityOwnershipServ
     private volatile DataTree localEntityOwnershipShardDataTree;
 
     DistributedEntityOwnershipService(final ActorUtils context) {
-        this.context = Preconditions.checkNotNull(context);
+        this.context = requireNonNull(context);
     }
 
     public static DistributedEntityOwnershipService start(final ActorUtils context,
@@ -87,9 +89,7 @@ public class DistributedEntityOwnershipService implements DOMEntityOwnershipServ
                 "entity-owners", ENTITY_OWNERSHIP_SHARD_NAME, ModuleShardStrategy.NAME, entityOwnersMemberNames),
                         newShardBuilder(context, strategyConfig), null);
 
-        Future<Object> createFuture = context.executeOperationAsync(shardManagerActor,
-                createShard, MESSAGE_TIMEOUT);
-
+        Future<Object> createFuture = context.executeOperationAsync(shardManagerActor, createShard, MESSAGE_TIMEOUT);
         createFuture.onComplete(new OnComplete<Object>() {
             @Override
             public void onComplete(final Throwable failure, final Object response) {
@@ -110,7 +110,8 @@ public class DistributedEntityOwnershipService implements DOMEntityOwnershipServ
             @Override
             public void onComplete(final Throwable failure, final Object response) {
                 if (failure != null) {
-                    LOG.debug("Error sending message {} to {}", message, shardActor, failure);
+                    // FIXME: CONTROLLER-1904: reduce the severity to info once we have a retry mechanism
+                    LOG.error("Error sending message {} to {}", message, shardActor, failure);
                 } else {
                     LOG.debug("{} message to {} succeeded", message, shardActor);
                 }
@@ -126,6 +127,7 @@ public class DistributedEntityOwnershipService implements DOMEntityOwnershipServ
                 @Override
                 public void onComplete(final Throwable failure, final ActorRef shardActor) {
                     if (failure != null) {
+                        // FIXME: CONTROLLER-1904: reduce the severity to info once we have a retry mechanism
                         LOG.error("Failed to find local {} shard", ENTITY_OWNERSHIP_SHARD_NAME, failure);
                     } else {
                         localEntityOwnershipShard = shardActor;
@@ -142,7 +144,7 @@ public class DistributedEntityOwnershipService implements DOMEntityOwnershipServ
     @Override
     public DOMEntityOwnershipCandidateRegistration registerCandidate(final DOMEntity entity)
             throws CandidateAlreadyRegisteredException {
-        Preconditions.checkNotNull(entity, "entity cannot be null");
+        requireNonNull(entity, "entity cannot be null");
 
         if (registeredEntities.putIfAbsent(entity, entity) != null) {
             throw new CandidateAlreadyRegisteredException(entity);
@@ -176,7 +178,7 @@ public class DistributedEntityOwnershipService implements DOMEntityOwnershipServ
 
     @Override
     public Optional<EntityOwnershipState> getOwnershipState(final DOMEntity forEntity) {
-        Preconditions.checkNotNull(forEntity, "forEntity cannot be null");
+        requireNonNull(forEntity, "forEntity cannot be null");
 
         DataTree dataTree = getLocalEntityOwnershipShardDataTree();
         if (dataTree == null) {
@@ -215,22 +217,30 @@ public class DistributedEntityOwnershipService implements DOMEntityOwnershipServ
 
     @VisibleForTesting
     @SuppressWarnings("checkstyle:IllegalCatch")
+    @SuppressFBWarnings(value = "REC_CATCH_EXCEPTION", justification = "Akka's Await.result() API contract")
     DataTree getLocalEntityOwnershipShardDataTree() {
-        if (localEntityOwnershipShardDataTree == null) {
-            try {
-                if (localEntityOwnershipShard == null) {
-                    localEntityOwnershipShard = Await.result(context.findLocalShardAsync(
-                            ENTITY_OWNERSHIP_SHARD_NAME), Duration.Inf());
-                }
+        final DataTree local = localEntityOwnershipShardDataTree;
+        if (local != null) {
+            return local;
+        }
 
-                localEntityOwnershipShardDataTree = (DataTree) Await.result(Patterns.ask(localEntityOwnershipShard,
-                        GetShardDataTree.INSTANCE, MESSAGE_TIMEOUT), Duration.Inf());
-            } catch (Exception e) {
+        if (localEntityOwnershipShard == null) {
+            try {
+                localEntityOwnershipShard = Await.result(context.findLocalShardAsync(
+                    ENTITY_OWNERSHIP_SHARD_NAME), Duration.Inf());
+            } catch (TimeoutException | InterruptedException e) {
                 LOG.error("Failed to find local {} shard", ENTITY_OWNERSHIP_SHARD_NAME, e);
+                return null;
             }
         }
 
-        return localEntityOwnershipShardDataTree;
+        try {
+            return localEntityOwnershipShardDataTree = (DataTree) Await.result(Patterns.ask(localEntityOwnershipShard,
+                GetShardDataTree.INSTANCE, MESSAGE_TIMEOUT), Duration.Inf());
+        } catch (TimeoutException | InterruptedException e) {
+            LOG.error("Failed to find local {} shard", ENTITY_OWNERSHIP_SHARD_NAME, e);
+            return null;
+        }
     }
 
     void unregisterListener(final String entityType, final DOMEntityOwnershipListener listener) {