import org.opendaylight.controller.cluster.datastore.modification.WriteModification;
import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
getSender().tell(SuccessReply.INSTANCE, getSelf());
- searchForEntitiesOwnedBy(localMemberName, new EntityWalker() {
+ searchForEntities(new EntityWalker() {
@Override
public void onEntity(MapEntryNode entityTypeNode, MapEntryNode entityNode) {
- Optional<DataContainerChild<? extends PathArgument, ?>> possibleType =
- entityTypeNode.getChild(ENTITY_TYPE_NODE_ID);
+ Optional<DataContainerChild<?, ?>> possibleType = entityTypeNode.getChild(ENTITY_TYPE_NODE_ID);
String entityType = possibleType.isPresent() ? possibleType.get().getValue().toString() : null;
if (registerListener.getEntityType().equals(entityType)) {
+ final boolean hasOwner;
+ final boolean isOwner;
+
+ Optional<DataContainerChild<?, ?>> possibleOwner = entityNode.getChild(ENTITY_OWNER_NODE_ID);
+ if (possibleOwner.isPresent()) {
+ isOwner = localMemberName.equals(possibleOwner.get().getValue().toString());
+ hasOwner = true;
+ } else {
+ isOwner = false;
+ hasOwner = false;
+ }
+
Entity entity = new Entity(entityType,
- (YangInstanceIdentifier) entityNode.getChild(ENTITY_ID_NODE_ID).get().getValue());
- listenerSupport.notifyEntityOwnershipListener(entity, false, true, true, registerListener.getListener());
+ (YangInstanceIdentifier) entityNode.getChild(ENTITY_ID_NODE_ID).get().getValue());
+
+ listenerSupport.notifyEntityOwnershipListener(entity, false, isOwner, hasOwner,
+ registerListener.getListener());
}
}
});
return ((MapNode)entity.getChild(CANDIDATE_NODE_ID).get()).getChild(candidateNodeKey(candidateName)).isPresent();
}
- private void searchForEntitiesOwnedBy(final String owner, final EntityWalker walker) {
- Optional<NormalizedNode<?, ?>> possibleEntityTypes = getDataStore().readNode(ENTITY_TYPES_PATH);
- if(!possibleEntityTypes.isPresent()) {
- return;
- }
-
- LOG.debug("{}: Searching for entities owned by {}", persistenceId(), owner);
-
- searchForEntities(new EntityWalker() {
- @Override
- public void onEntity(MapEntryNode entityTypeNode, MapEntryNode entityNode) {
- Optional<DataContainerChild<? extends PathArgument, ?>> possibleOwner =
- entityNode.getChild(ENTITY_OWNER_NODE_ID);
- if (possibleOwner.isPresent() && owner.equals(possibleOwner.get().getValue().toString())) {
- walker.onEntity(entityTypeNode, entityNode);
- }
- }
- });
- }
-
private void searchForEntities(EntityWalker walker) {
Optional<NormalizedNode<?, ?>> possibleEntityTypes = getDataStore().readNode(ENTITY_TYPES_PATH);
if(!possibleEntityTypes.isPresent()) {
}
for(MapEntryNode entityType: ((MapNode) possibleEntityTypes.get()).getValue()) {
- Optional<DataContainerChild<? extends PathArgument, ?>> possibleEntities =
- entityType.getChild(ENTITY_NODE_ID);
+ Optional<DataContainerChild<?, ?>> possibleEntities = entityType.getChild(ENTITY_NODE_ID);
if(!possibleEntities.isPresent()) {
- continue; // shouldn't happen but handle anyway
+ // shouldn't happen but handle anyway
+ continue;
}
for(MapEntryNode entity: ((MapNode) possibleEntities.get()).getValue()) {
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.AdditionalMatchers.or;
-import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.timeout;
// Register follower2 candidate for entity2 and verify it gets added but doesn't become owner
follower2EntityOwnershipService.registerListener(ENTITY_TYPE1, follower2MockListener);
+ verify(follower2MockListener, timeout(5000)).ownershipChanged(ownershipChange(ENTITY2, false, false, true));
+ verify(follower2MockListener, timeout(5000)).ownershipChanged(ownershipChange(ENTITY1, false, false, true));
+
follower2EntityOwnershipService.registerCandidate(ENTITY2);
verifyCandidates(leaderDistributedDataStore, ENTITY2, "member-2", "member-3");
verifyOwner(leaderDistributedDataStore, ENTITY2, "member-2");
// if the original ownership change with "member-2 is replicated to follower2 after the listener is
// registered.
Uninterruptibles.sleepUninterruptibly(500, TimeUnit.MILLISECONDS);
- verify(follower2MockListener, atMost(1)).ownershipChanged(ownershipChange(ENTITY2, false, false, true));
verify(follower2MockListener, timeout(5000)).ownershipChanged(ownershipChange(ENTITY2, false, true, true));
// Register follower1 candidate for entity3 and verify it becomes owner
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
ownershipChange(entity3, false, true, true)));
Uninterruptibles.sleepUninterruptibly(300, TimeUnit.MILLISECONDS);
verify(listener, never()).ownershipChanged(ownershipChange(entity4));
- verify(listener, never()).ownershipChanged(ownershipChange(entity1));
+ verify(listener, times(1)).ownershipChanged(ownershipChange(entity1));
}
private static void commitModification(TestActorRef<EntityOwnershipShard> shard, NormalizedNode<?, ?> node,