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=2af106980f5041bba4ca93eabdf40451d5d089a3;hb=bb1891e328feee08ccd29c96034e967f1eeccece;hp=fb7e9e4668b5cf7edf97996cf3629bf96fe150c8;hpb=e86a9107fc3ae4451b5a7eb54a03f9ad6776fe72;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 fb7e9e4668..2af106980f 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 @@ -143,7 +143,7 @@ class EntityOwnershipShard extends Shard { String currentOwner = getCurrentOwner(selectOwner.getEntityPath()); if(Strings.isNullOrEmpty(currentOwner)) { String entityType = EntityOwnersModel.entityTypeFromEntityPath(selectOwner.getEntityPath()); - writeNewOwner(selectOwner.getEntityPath(), newOwner(selectOwner.getAllCandidates(), + writeNewOwner(selectOwner.getEntityPath(), newOwner(currentOwner, selectOwner.getAllCandidates(), entityOwnershipStatistics.byEntityType(entityType), selectOwner.getOwnerSelectionStrategy())); @@ -274,6 +274,11 @@ class EntityOwnershipShard extends Shard { newLeader, isLeader); if(isLeader) { + + // Clear all existing strategies so that they get re-created when we call createStrategy again + // This allows the strategies to be re-initialized with existing statistics maintained by + // EntityOwnershipStatistics + strategyConfig.clearStrategies(); // We were just elected leader. If the old leader is down, select new owners for the entities // owned by the down leader. @@ -300,7 +305,7 @@ class EntityOwnershipShard extends Shard { if(message.getRemovedCandidate().equals(currentOwner) || message.getRemainingCandidates().size() == 0){ String entityType = EntityOwnersModel.entityTypeFromEntityPath(message.getEntityPath()); writeNewOwner(message.getEntityPath(), - newOwner(message.getRemainingCandidates(), entityOwnershipStatistics.byEntityType(entityType), + newOwner(currentOwner, message.getRemainingCandidates(), entityOwnershipStatistics.byEntityType(entityType), getEntityOwnerElectionStrategy(message.getEntityPath()))); } } else { @@ -323,7 +328,7 @@ class EntityOwnershipShard extends Shard { private EntityOwnerSelectionStrategy getEntityOwnerElectionStrategy(YangInstanceIdentifier entityPath) { final String entityType = EntityOwnersModel.entityTypeFromEntityPath(entityPath); - return strategyConfig.createStrategy(entityType); + return strategyConfig.createStrategy(entityType, entityOwnershipStatistics.byEntityType(entityType)); } private void onCandidateAdded(CandidateAdded message) { @@ -348,13 +353,13 @@ class EntityOwnershipShard extends Shard { LOG.debug("{}: Using strategy {} to select owner", persistenceId(), strategy); if(Strings.isNullOrEmpty(currentOwner)){ if(strategy.getSelectionDelayInMillis() == 0L) { - writeNewOwner(message.getEntityPath(), newOwner(message.getAllCandidates(), + writeNewOwner(message.getEntityPath(), newOwner(currentOwner, message.getAllCandidates(), entityOwnershipStatistics.byEntityType(entityType), strategy)); } else if(message.getAllCandidates().size() == availableMembers) { LOG.debug("{}: Received the maximum candidates requests : {} writing new owner", persistenceId(), availableMembers); cancelOwnerSelectionTask(message.getEntityPath()); - writeNewOwner(message.getEntityPath(), newOwner(message.getAllCandidates(), + writeNewOwner(message.getEntityPath(), newOwner(currentOwner, message.getAllCandidates(), entityOwnershipStatistics.byEntityType(entityType), strategy)); } else { scheduleOwnerSelection(message.getEntityPath(), message.getAllCandidates(), strategy); @@ -464,12 +469,12 @@ class EntityOwnershipShard extends Shard { } } - private String newOwner(Collection candidates, Map statistics, EntityOwnerSelectionStrategy ownerSelectionStrategy) { + private String newOwner(String currentOwner, Collection candidates, Map statistics, EntityOwnerSelectionStrategy ownerSelectionStrategy) { Collection viableCandidates = getViableCandidates(candidates); if(viableCandidates.size() == 0){ return ""; } - return ownerSelectionStrategy.newOwner(viableCandidates, statistics); + return ownerSelectionStrategy.newOwner(currentOwner, viableCandidates); } private Collection getViableCandidates(Collection candidates) {