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%2FEntityOwnershipShard.java;h=1f31d122cd271ac4824bb1d490c579233d1d51cd;hb=refs%2Fchanges%2F43%2F29643%2F1;hp=2f3b51e1d1d7ae4c8c2e73cde2ef49788c0fe3c0;hpb=eb359c6eaee33eb91ac26ac8a3439be4ae1a974a;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShard.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShard.java index 2f3b51e1d1..1f31d122cd 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShard.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShard.java @@ -27,7 +27,6 @@ import akka.actor.ActorRef; import akka.actor.ActorSelection; import akka.actor.Cancellable; import akka.pattern.Patterns; -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.base.Strings; @@ -79,8 +78,9 @@ class EntityOwnershipShard extends Shard { private final EntityOwnershipListenerSupport listenerSupport; private final Set downPeerMemberNames = new HashSet<>(); private final Map peerIdToMemberNames = new HashMap<>(); - private EntityOwnerSelectionStrategyConfig strategyConfig; - private Map entityToScheduledOwnershipTask = new HashMap<>(); + private final EntityOwnerSelectionStrategyConfig strategyConfig; + private final Map entityToScheduledOwnershipTask = new HashMap<>(); + private final EntityOwnershipStatistics entityOwnershipStatistics; private static DatastoreContext noPersistenceDatastoreContext(DatastoreContext datastoreContext) { return DatastoreContext.newBuilderFrom(datastoreContext).persistent(false).build(); @@ -91,7 +91,9 @@ class EntityOwnershipShard extends Shard { this.localMemberName = builder.localMemberName; this.commitCoordinator = new EntityOwnershipShardCommitCoordinator(builder.localMemberName, LOG); this.listenerSupport = new EntityOwnershipListenerSupport(getContext(), persistenceId()); - this.strategyConfig = EntityOwnerSelectionStrategyConfig.newBuilder().build(); + this.strategyConfig = builder.ownerSelectionStrategyConfig; + this.entityOwnershipStatistics = new EntityOwnershipStatistics(); + this.entityOwnershipStatistics.init(getDataStore()); for(String peerId: getRaftActorContext().getPeerIds()) { ShardIdentifier shardId = ShardIdentifier.builder().fromShardIdString(peerId).build(); @@ -140,7 +142,9 @@ class EntityOwnershipShard extends Shard { private void onSelectOwner(SelectOwner selectOwner) { String currentOwner = getCurrentOwner(selectOwner.getEntityPath()); if(Strings.isNullOrEmpty(currentOwner)) { + String entityType = EntityOwnersModel.entityTypeFromEntityPath(selectOwner.getEntityPath()); writeNewOwner(selectOwner.getEntityPath(), newOwner(selectOwner.getAllCandidates(), + entityOwnershipStatistics.byEntityType(entityType), selectOwner.getOwnerSelectionStrategy())); Cancellable cancellable = entityToScheduledOwnershipTask.get(selectOwner.getEntityPath()); @@ -269,9 +273,11 @@ class EntityOwnershipShard extends Shard { if(isLeader()) { String currentOwner = getCurrentOwner(message.getEntityPath()); - if(message.getRemovedCandidate().equals(currentOwner)){ + if(message.getRemovedCandidate().equals(currentOwner) || message.getRemainingCandidates().size() == 0){ + String entityType = EntityOwnersModel.entityTypeFromEntityPath(message.getEntityPath()); writeNewOwner(message.getEntityPath(), - newOwner(message.getRemainingCandidates(), getEntityOwnerElectionStrategy(message.getEntityPath()))); + newOwner(message.getRemainingCandidates(), entityOwnershipStatistics.byEntityType(entityType), + getEntityOwnerElectionStrategy(message.getEntityPath()))); } } else { // We're not the leader. If the removed candidate is our local member then check if we actually @@ -311,7 +317,9 @@ class EntityOwnershipShard extends Shard { EntityOwnerSelectionStrategy strategy = getEntityOwnerElectionStrategy(message.getEntityPath()); if(Strings.isNullOrEmpty(currentOwner)){ if(strategy.getSelectionDelayInMillis() == 0L) { - writeNewOwner(message.getEntityPath(), newOwner(message.getAllCandidates(), strategy)); + String entityType = EntityOwnersModel.entityTypeFromEntityPath(message.getEntityPath()); + writeNewOwner(message.getEntityPath(), newOwner(message.getAllCandidates(), + entityOwnershipStatistics.byEntityType(entityType), strategy)); } else { scheduleOwnerSelection(message.getEntityPath(), message.getAllCandidates(), strategy); } @@ -345,7 +353,11 @@ class EntityOwnershipShard extends Shard { node(entityTypeNode.getIdentifier()).node(ENTITY_NODE_ID).node(entityNode.getIdentifier()). node(ENTITY_OWNER_NODE_ID).build(); - Object newOwner = newOwner(getCandidateNames(entityNode), getEntityOwnerElectionStrategy(entityPath)); + String entityType = EntityOwnersModel.entityTypeFromEntityPath(entityPath); + + Object newOwner = newOwner(getCandidateNames(entityNode), + entityOwnershipStatistics.byEntityType(entityType), + getEntityOwnerElectionStrategy(entityPath)); LOG.debug("{}: Found entity {}, writing new owner {}", persistenceId(), entityPath, newOwner); @@ -397,7 +409,7 @@ class EntityOwnershipShard extends Shard { public void onEntity(MapEntryNode entityTypeNode, MapEntryNode entityNode) { Optional> possibleOwner = entityNode.getChild(ENTITY_OWNER_NODE_ID); - if(possibleOwner.isPresent() && owner.equals(possibleOwner.get().getValue().toString())) { + if (possibleOwner.isPresent() && owner.equals(possibleOwner.get().getValue().toString())) { walker.onEntity(entityTypeNode, entityNode); } } @@ -423,7 +435,7 @@ class EntityOwnershipShard extends Shard { } } - private Collection getCandidateNames(MapEntryNode entity) { + private static Collection getCandidateNames(MapEntryNode entity) { Collection candidates = ((MapNode) entity.getChild(CANDIDATE_NODE_ID).get()).getValue(); Collection candidateNames = new ArrayList<>(candidates.size()); for(MapEntryNode candidate: candidates) { @@ -460,12 +472,12 @@ class EntityOwnershipShard extends Shard { entityToScheduledOwnershipTask.put(entityPath, lastScheduledTask); } - private String newOwner(Collection candidates, EntityOwnerSelectionStrategy ownerSelectionStrategy) { + private String newOwner(Collection candidates, Map statistics, EntityOwnerSelectionStrategy ownerSelectionStrategy) { Collection viableCandidates = getViableCandidates(candidates); if(viableCandidates.size() == 0){ return ""; } - return ownerSelectionStrategy.newOwner(viableCandidates); + return ownerSelectionStrategy.newOwner(viableCandidates, statistics); } private Collection getViableCandidates(Collection candidates) { @@ -491,21 +503,13 @@ class EntityOwnershipShard extends Shard { void onEntity(MapEntryNode entityTypeNode, MapEntryNode entityNode); } - @VisibleForTesting - void addEntityOwnerSelectionStrategy(String entityType, - Class clazz, - long delay){ - EntityOwnerSelectionStrategyConfig config = EntityOwnerSelectionStrategyConfig.newBuilder() - .addStrategy(entityType, clazz, delay).build(); - this.strategyConfig = config; - } - public static Builder newBuilder() { return new Builder(); } static class Builder extends Shard.AbstractBuilder { private String localMemberName; + private EntityOwnerSelectionStrategyConfig ownerSelectionStrategyConfig; protected Builder() { super(EntityOwnershipShard.class); @@ -517,10 +521,17 @@ class EntityOwnershipShard extends Shard { return this; } + Builder ownerSelectionStrategyConfig(EntityOwnerSelectionStrategyConfig ownerSelectionStrategyConfig){ + checkSealed(); + this.ownerSelectionStrategyConfig = ownerSelectionStrategyConfig; + return this; + } + @Override protected void verify() { super.verify(); Preconditions.checkNotNull(localMemberName, "localMemberName should not be null"); + Preconditions.checkNotNull(ownerSelectionStrategyConfig, "ownerSelectionStrategyConfig should not be null"); } } }