Getting latest state from Ownership RPC 74/28974/4
authorKamal Rameshan <kramesha@cisco.com>
Fri, 2 Oct 2015 07:51:16 +0000 (00:51 -0700)
committerKamal Rameshan <kramesha@cisco.com>
Sat, 7 Nov 2015 01:15:59 +0000 (17:15 -0800)
Takes care of two scenarios
1. Switch connects to a second controller, after first controller is master.
   In this case it wont get an Ownership Changed notification

2. Controller which is slave restarts and registers a candidate. Still it wont get a notification.

Notification is only sent when there is a change in the ownership in the OwnershipService

Change-Id: Ifdc5023a711bb66eb36f4d03e294456776810c50
Signed-off-by: Kamal Rameshan <kramesha@cisco.com>
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/role/OpenflowOwnershipListener.java

index 9d38a066b8b52709894da50e90d904426fb62f11..814cc9138401c7e31c80c27dce3d85e6b577aa6e 100644 (file)
@@ -12,11 +12,14 @@ import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+
+import com.google.common.base.Optional;
 import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipChange;
 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipListener;
 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipListenerRegistration;
 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipState;
 import org.opendaylight.openflowplugin.api.openflow.role.RoleChangeListener;
 import org.opendaylight.openflowplugin.api.openflow.role.RoleManager;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.role.service.rev150727.OfpRole;
@@ -33,7 +36,6 @@ public class OpenflowOwnershipListener implements EntityOwnershipListener, AutoC
     private EntityOwnershipService entityOwnershipService;
     private EntityOwnershipListenerRegistration entityOwnershipListenerRegistration;
     private Map<Entity, RoleChangeListener> roleChangeListenerMap = new ConcurrentHashMap<>();
-    private final Map<Entity, Boolean> ownershipMap = new ConcurrentHashMap<>();
     private final ExecutorService roleChangeExecutor = Executors.newSingleThreadExecutor();
 
     public OpenflowOwnershipListener(EntityOwnershipService entityOwnershipService) {
@@ -50,8 +52,6 @@ public class OpenflowOwnershipListener implements EntityOwnershipListener, AutoC
 
         RoleChangeListener roleChangeListener = roleChangeListenerMap.get(ownershipChange.getEntity());
 
-        ownershipMap.put(ownershipChange.getEntity(), ownershipChange.isOwner());
-
         if (roleChangeListener != null) {
             LOG.debug("Found local entity:{}", ownershipChange.getEntity());
 
@@ -60,7 +60,6 @@ public class OpenflowOwnershipListener implements EntityOwnershipListener, AutoC
                 // possible the last node to be disconnected from device.
                 // eligible for the device to get deleted from inventory.
                 LOG.debug("Initiate removal from operational. Possibly the last node to be disconnected for :{}. ", ownershipChange);
-                ownershipMap.remove(ownershipChange.getEntity());
                 roleChangeListener.onDeviceDisconnectedFromCluster();
 
             } else {
@@ -78,23 +77,28 @@ public class OpenflowOwnershipListener implements EntityOwnershipListener, AutoC
         final Entity entity = roleChangeListener.getEntity();
         final OpenflowOwnershipListener self = this;
 
-        if(this.hasOwner(entity)) {
-            LOG.debug("An owner exist for entity {}", entity);
-            roleChangeExecutor.submit(new Callable<Object>() {
-                @Override
-                public Object call() throws Exception {
-                    if(self.isOwner(entity)){
-                        LOG.debug("Ownership is here for entity {} becoming master", entity);
-                        roleChangeListener.onRoleChanged(OfpRole.BECOMEMASTER, OfpRole.BECOMEMASTER);
-                    } else {
-                        LOG.debug("Ownership is NOT here for entity {} becoming alave", entity);
-                        roleChangeListener.onRoleChanged(OfpRole.BECOMESLAVE, OfpRole.BECOMESLAVE);
-
+        Optional<EntityOwnershipState> entityOwnershipStateOptional = entityOwnershipService.getOwnershipState(entity);
+
+        if (entityOwnershipStateOptional != null && entityOwnershipStateOptional.isPresent()) {
+            final EntityOwnershipState entityOwnershipState = entityOwnershipStateOptional.get();
+            if (entityOwnershipState.hasOwner()) {
+                LOG.debug("An owner exist for entity {}", entity);
+                roleChangeExecutor.submit(new Callable<Object>() {
+                    @Override
+                    public Object call() throws Exception {
+                        if (entityOwnershipState.isOwner()) {
+                            LOG.debug("Ownership is here for entity {} becoming master", entity);
+                            roleChangeListener.onRoleChanged(OfpRole.BECOMEMASTER, OfpRole.BECOMEMASTER);
+                        } else {
+                            LOG.debug("Ownership is NOT here for entity {} becoming alave", entity);
+                            roleChangeListener.onRoleChanged(OfpRole.BECOMESLAVE, OfpRole.BECOMESLAVE);
+
+                        }
+
+                        return null;
                     }
-
-                    return null;
-                }
-            });
+                });
+            }
         }
     }
 
@@ -104,19 +108,4 @@ public class OpenflowOwnershipListener implements EntityOwnershipListener, AutoC
             entityOwnershipListenerRegistration.close();
         }
     }
-
-    private boolean hasOwner(Entity entity){
-        return ownershipMap.containsKey(entity);
-    }
-
-    private boolean isOwner(Entity entity){
-        if(hasOwner(entity)){
-            Boolean isOwner = ownershipMap.get(entity);
-            if(isOwner != null) {
-                return isOwner.booleanValue();
-            }
-        }
-
-        return false;
-    }
 }