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%2Fentityownership%2FEntityOwnershipListenerSupport.java;h=26e6ab75675b810f5666613566ff78a614f84e38;hb=07c96b0fa318b7bf559df4954f705d06a44f1354;hp=ed4a004ed046b72fd83ef17a23dfc0552f8d1512;hpb=a4d9810d7211097f2803174d0c23a27b53dbc9d2;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipListenerSupport.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipListenerSupport.java index ed4a004ed0..26e6ab7567 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipListenerSupport.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipListenerSupport.java @@ -12,14 +12,16 @@ import akka.actor.ActorRef; import akka.actor.PoisonPill; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import java.util.Arrays; import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; import java.util.IdentityHashMap; import java.util.Map; -import org.opendaylight.controller.cluster.datastore.entityownership.messages.EntityOwnershipChanged; -import org.opendaylight.controller.md.sal.common.api.clustering.Entity; -import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipCandidate; -import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipListener; +import java.util.Set; +import org.opendaylight.mdsal.eos.common.api.EntityOwnershipChangeState; +import org.opendaylight.mdsal.eos.dom.api.DOMEntity; +import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipChange; +import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,9 +35,10 @@ class EntityOwnershipListenerSupport { private final String logId; private final ActorContext actorContext; - private final Map listenerActorMap = new IdentityHashMap<>(); - private final Multimap entityListenerMap = HashMultimap.create(); - private final Multimap entityTypeListenerMap = HashMultimap.create(); + private final Map listenerActorMap = new IdentityHashMap<>(); + private final Set entitiesWithCandidateSet = new HashSet<>(); + private final Multimap entityTypeListenerMap = HashMultimap.create(); + private volatile boolean inJeopardy = false; EntityOwnershipListenerSupport(ActorContext actorContext, String logId) { this.actorContext = actorContext; @@ -46,62 +49,63 @@ class EntityOwnershipListenerSupport { return logId; } - boolean hasCandidateForEntity(Entity entity) { - for(EntityOwnershipListener listener: entityListenerMap.get(entity)) { - if(listener instanceof EntityOwnershipCandidate) { - return true; - } - } - - return false; + /** + * Set the in-jeopardy flag and indicate its previous state. + * + * @param inJeopardy new value of the in-jeopardy flag + * @return Previous value of the flag. + */ + boolean setInJeopardy(final boolean inJeopardy) { + final boolean wasInJeopardy = this.inJeopardy; + this.inJeopardy = inJeopardy; + return wasInJeopardy; } - void addEntityOwnershipListener(Entity entity, EntityOwnershipListener listener) { - LOG.debug("{}: Adding EntityOwnershipListener {} for {}", logId, listener, entity); - - addListener(listener, entity, entityListenerMap); + boolean hasCandidateForEntity(DOMEntity entity) { + return entitiesWithCandidateSet.contains(entity); } - void addEntityOwnershipListener(String entityType, EntityOwnershipListener listener) { - LOG.debug("{}: Adding EntityOwnershipListener {} for entity type {}", logId, listener, entityType); + void setHasCandidateForEntity(DOMEntity entity) { + entitiesWithCandidateSet.add(entity); + } - addListener(listener, entityType, entityTypeListenerMap); + void unsetHasCandidateForEntity(DOMEntity entity) { + entitiesWithCandidateSet.remove(entity); } - void removeEntityOwnershipListener(Entity entity, EntityOwnershipListener listener) { - LOG.debug("{}: Removing EntityOwnershipListener {} for {}", logId, listener, entity); + void addEntityOwnershipListener(String entityType, DOMEntityOwnershipListener listener) { + LOG.debug("{}: Adding EntityOwnershipListener {} for entity type {}", logId, listener, entityType); - removeListener(listener, entity, entityListenerMap); + addListener(listener, entityType); } - void removeEntityOwnershipListener(String entityType, EntityOwnershipListener listener) { + void removeEntityOwnershipListener(String entityType, DOMEntityOwnershipListener listener) { LOG.debug("{}: Removing EntityOwnershipListener {} for entity type {}", logId, listener, entityType); - removeListener(listener, entityType, entityTypeListenerMap); + removeListener(listener, entityType); } - void notifyEntityOwnershipListeners(Entity entity, boolean wasOwner, boolean isOwner) { - notifyListeners(entity, entity, wasOwner, isOwner, entityListenerMap); - notifyListeners(entity, entity.getType(), wasOwner, isOwner, entityTypeListenerMap); + void notifyEntityOwnershipListeners(DOMEntity entity, boolean wasOwner, boolean isOwner, boolean hasOwner) { + notifyListeners(entity, entity.getType(), wasOwner, isOwner, hasOwner); } - void notifyEntityOwnershipListener(Entity entity, boolean wasOwner, boolean isOwner, - EntityOwnershipListener listener) { - notifyListeners(entity, wasOwner, isOwner, Arrays.asList(listener)); + void notifyEntityOwnershipListener(DOMEntity entity, boolean wasOwner, boolean isOwner, boolean hasOwner, + DOMEntityOwnershipListener listener) { + notifyListeners(entity, wasOwner, isOwner, hasOwner, Collections.singleton(listener)); } - private void notifyListeners(Entity entity, T mapKey, boolean wasOwner, boolean isOwner, - Multimap listenerMap) { - Collection listeners = listenerMap.get(mapKey); + private void notifyListeners(DOMEntity entity, String mapKey, boolean wasOwner, boolean isOwner, boolean hasOwner) { + Collection listeners = entityTypeListenerMap.get(mapKey); if(!listeners.isEmpty()) { - notifyListeners(entity, wasOwner, isOwner, listeners); + notifyListeners(entity, wasOwner, isOwner, hasOwner, listeners); } } - private void notifyListeners(Entity entity, boolean wasOwner, boolean isOwner, - Collection listeners) { - EntityOwnershipChanged changed = new EntityOwnershipChanged(entity, wasOwner, isOwner); - for(EntityOwnershipListener listener: listeners) { + private void notifyListeners(DOMEntity entity, boolean wasOwner, boolean isOwner, boolean hasOwner, + Collection listeners) { + DOMEntityOwnershipChange changed = new DOMEntityOwnershipChange(entity, + EntityOwnershipChangeState.from(wasOwner, isOwner, hasOwner), inJeopardy); + for(DOMEntityOwnershipListener listener: listeners) { ActorRef listenerActor = listenerActorFor(listener); LOG.debug("{}: Notifying EntityOwnershipListenerActor {} with {}", logId, listenerActor, changed); @@ -110,9 +114,8 @@ class EntityOwnershipListenerSupport { } } - private void addListener(EntityOwnershipListener listener, T mapKey, - Multimap toListenerMap) { - if(toListenerMap.put(mapKey, listener)) { + private void addListener(DOMEntityOwnershipListener listener, String mapKey) { + if (entityTypeListenerMap.put(mapKey, listener)) { ListenerActorRefEntry listenerEntry = listenerActorMap.get(listener); if(listenerEntry == null) { listenerActorMap.put(listener, new ListenerActorRefEntry()); @@ -122,9 +125,8 @@ class EntityOwnershipListenerSupport { } } - private void removeListener(EntityOwnershipListener listener, T mapKey, - Multimap fromListenerMap) { - if(fromListenerMap.remove(mapKey, listener)) { + private void removeListener(DOMEntityOwnershipListener listener, String mapKey) { + if (entityTypeListenerMap.remove(mapKey, listener)) { ListenerActorRefEntry listenerEntry = listenerActorMap.get(listener); LOG.debug("{}: Found {}", logId, listenerEntry); @@ -141,7 +143,7 @@ class EntityOwnershipListenerSupport { } } - private ActorRef listenerActorFor(EntityOwnershipListener listener) { + private ActorRef listenerActorFor(DOMEntityOwnershipListener listener) { return listenerActorMap.get(listener).actorFor(listener); } @@ -149,7 +151,7 @@ class EntityOwnershipListenerSupport { ActorRef actorRef; int referenceCount = 1; - ActorRef actorFor(EntityOwnershipListener listener) { + ActorRef actorFor(DOMEntityOwnershipListener listener) { if(actorRef == null) { actorRef = actorContext.actorOf(EntityOwnershipListenerActor.props(listener));