public class SimpleAssignmentStrategy extends Object implements PartitionAssignmentStrategy, SimpleStrategyMBean
The SimpleAssignmentStrategy is an extensible implementation of the internal distribution algorithm that was available prior to Coherence 3.7.
Modifier and Type | Class and Description |
---|---|
protected class |
SimpleAssignmentStrategy.AnalysisContext
AnalysisContext holds the working view of the partition ownership that is used throughout the analysis and is used to reflect changes made during this analysis.
|
protected static class |
SimpleAssignmentStrategy.BackupStrength
BackupStrength represents a level of "strength" or "resiliency" between the primary and backup owners of a partition.
|
protected class |
SimpleAssignmentStrategy.JMXPartitionStats
A class that calculate MBean attribute values from last sampled PartitionStats
|
static interface |
SimpleAssignmentStrategy.LoadCalculator
LoadCalculator is used to calculate the scalar load (expressed as an integer) of a partition (or set of partitions).
|
static class |
SimpleAssignmentStrategy.SimpleLoadCalculator
SimpleLoadCalculator defines a "count-based" load (e.g. the load of each partition is defined to be 1).
|
Modifier and Type | Field and Description |
---|---|
protected SimpleAssignmentStrategy.AnalysisContext |
m_ctxLast
The last analysis context.
|
protected boolean |
m_fRefresh
True if JMXPartitionStats should be updated.
|
protected DistributionManager |
m_manager
The DistributionManager.
|
protected Map<Ownership,PartitionSet> |
m_mapSuggestLast
The Map containing the last distribution suggested by this strategy.
|
protected Set |
m_setOwnersLast
The Set of ownership-enabled members at the time of the last analysis.
|
protected SimpleAssignmentStrategy.JMXPartitionStats |
m_statsPartition
The JMXPartitionStats that hold the last updated jmx attributes.
|
protected static Comparator |
MEMBERID_COMPARATOR
Comparator used to provide arbitrary (equals-compatible) comparisons between members.
|
protected static String |
MSG_NO_PENDING
The message returned by SimpleStrategyMBean when all suggested distributions have completed and none are in-progress or scheduled.
|
protected static String |
MSG_NO_RESULT
The message returned by SimpleStrategyMBean when the distribution coordinator has not done its first analysis yet.
|
NOTIFY_LOST
Constructor and Description |
---|
SimpleAssignmentStrategy()
Default constructor.
|
Modifier and Type | Method and Description |
---|---|
long |
analyzeDistribution()
Analyze the distribution and return the desired time interval before the next distribution analysis.
|
protected long |
analyzeDistribution(SimpleAssignmentStrategy.AnalysisContext ctx)
Analyze the distribution using the specified analysis context.
|
void |
analyzeOrphans(Map<Member,PartitionSet> mapConstraints)
Analyze and suggest the assignment of orphaned partitions (partitions without an active primary or backup owner) subject to the specified constraints.
|
protected static Comparator |
chainComparators(Comparator comp1, Comparator comp2)
Helper method to return a Comparator chaining the specified comparators.
|
protected static Comparator |
chainComparators(Comparator comp1, Comparator comp2, Comparator comp3)
Helper method to return a Comparator chaining the specified comparators.
|
protected int |
checkBackupBalance(SimpleAssignmentStrategy.AnalysisContext ctx)
Check that the distribution of backup partitions is balanced.
|
protected int |
checkBackupStrong(SimpleAssignmentStrategy.AnalysisContext ctx)
Check that the backups are strong.
|
protected void |
checkEndangered(SimpleAssignmentStrategy.AnalysisContext ctx)
Check the distribution to ensure that backups are created for any "endangered" partitions.
|
protected void |
checkLeaving(SimpleAssignmentStrategy.AnalysisContext ctx)
Check for any service members that are leaving, and adjust the distribution plan accordingly.
|
protected void |
checkPrimaryBalance(SimpleAssignmentStrategy.AnalysisContext ctx)
Check the distribution to ensure that primary the partition load is balanced.
|
protected Map<Member,PartitionSet[]> |
collectScheduledDistributions()
Collect the scheduled partition distributions, grouped by the primary owner and storage index.
|
protected int |
doBalancePrimary(SimpleAssignmentStrategy.AnalysisContext ctx, Member memberFrom, PartitionSet parts, Member[] aMembersTarget)
Do balancing transfers for primary distribution.
|
protected void |
emitLossNotification(PartitionSet partsLost)
Emit a partition loss notification for given partitions.
|
protected static int |
filterArray(Object[] ao, Filter filter)
Apply the specified filter to the elements of the specified array.
|
protected static int |
filterArray(Object[] ao, int cElems, Filter filter)
Apply the specified filter to the specified array elements.
|
protected static int |
filterSort(Object[] ao, Comparator comparator, Filter filter)
Filter the elements in the specified array and sort any matching elements using the specified comparator.
|
protected static int |
filterSort(Object[] ao, int cElems, Comparator comparator, Filter filter)
Filter the specified array elements and sort any matching elements using the specified comparator.
|
long |
getAveragePartitionSizeKB()
Get the average partition storage size.
|
long |
getAverageStorageSizeKB()
Get the average node storage size.
|
int |
getBackupCount()
Get the configured number of backups.
|
int |
getCoordinatorId()
Get the node id of the ownership distribution coordinator.
|
String |
getDescription()
Return a human-readable description of the state of the partition assignment.
|
int |
getFairShareBackup()
Get the number of backup partitions per storage-enabled service member that this strategy will currently attempt to maintain.
|
int |
getFairSharePrimary()
Get the number of primary partitions per storage-enabled service member that this strategy will currently attempt to maintain.
|
String |
getHAStatus()
The High Availability status for the service.
|
String |
getHATarget()
The High Availability status that this strategy attempts to achieve.
|
SimpleAssignmentStrategy.AnalysisContext |
getLastAnalysisContext()
Return the last AnalysisContext.
|
Date |
getLastAnalysisTime()
Get the last time a partition distribution analysis was performed.
|
Set |
getLastOwnershipMembers()
Return the set of ownership-enabled members present when the analysis was last considered.
|
DistributionManager |
getManager()
Return the DistributionManager.
|
int |
getMaxLoadNodeId()
Get the node id with the maximum storage size.
|
long |
getMaxPartitionSizeKB()
Get the maximum partition storage size.
|
long |
getMaxStorageSizeKB()
Get maximum node storage size.
|
protected Member |
getMember(int nMemberId)
Return the PartitionedService Member with the specified mini-id.
|
protected long |
getMemberJoinDelay()
Return the amount of time in ms to delay the analysis after a member has joined.
|
int |
getPartitionCount()
Get the configured number of partitions for the service.
|
int |
getRemainingDistributionCount()
Get the number of distributions (partition transfers) that remain to be completed before the service achieves the goals set by this strategy.
|
int |
getServiceMachineCount()
Get the number of machines that host storage-enabled nodes running this service.
|
int |
getServiceNodeCount()
Get the number of storage-enabled nodes running this service.
|
int |
getServiceRackCount()
Get the number of racks that host storage-enabled nodes running this service.
|
int |
getServiceSiteCount()
Get the number of sites that host storage-enabled nodes running this service.
|
String |
getStrategyName()
Get name of the PartitionAssignmentStrategy in use.
|
protected long |
getSuggestionCompletionDelay()
Return the amount of time in ms to delay the analysis after a distribution suggestion has been made and before it is carried out.
|
protected PartitionSet |
getUnownedPartitions(PartitionSet parts, int nMember)
Calculate a subset of the PartitionSet consisting of partitions that are not owned (primary or backup) by the specified member.
|
protected int |
getVariance(SimpleAssignmentStrategy.AnalysisContext ctx, boolean fPrimary)
Return the maximum load variance in the partition assignments represented by the analysis context.
|
void |
init(DistributionManager manager)
Initialize the PartitionAssignmentStrategy and bind it to the specified DistributionManager.
|
SimpleAssignmentStrategy.AnalysisContext |
instantiateAnalysisContext()
Factory method.
|
SimpleAssignmentStrategy.LoadCalculator |
instantiateLoadCalculator(boolean fPrimary)
Instantiate the load calculator.
|
protected String |
makeMBeanName(PartitionedService service)
Create a name for the MBean representing this strategy.
|
protected void |
registerMBean()
Register an MBean representing this SimpleAssignmentStrategy.
|
String |
reportScheduledDistributions(boolean fVerbose)
Report partitions that storage-enabled members are waiting to receive or still need to send in order to achieve distribution goal set by the strategy.
|
void |
setLastAnalysisContext(SimpleAssignmentStrategy.AnalysisContext ctx)
Set the last AnalysisContext.
|
protected void |
setLastOwnershipMembers(Set setOwners)
Record the set of ownership-enabled members present when the analysis was last considered.
|
protected SortedMap<Integer,PartitionSet> |
splitByOwner(PartitionSet parts)
Split the partition set scheduled for distribution by the current primary owner (all transfers originate from the primary owner).
|
String |
toString() |
protected void |
unregisterMBean()
Unregister the MBean representing this SimpleAssignmentStrategy.
|
protected SimpleAssignmentStrategy.JMXPartitionStats |
updateCompositeStats()
Return a JMXPartitionStats that contains calculated MBean Attributes, updated periodically.
|
protected void |
validateBackups(SimpleAssignmentStrategy.AnalysisContext ctx)
Check if there are enough ownership members to maintain the configured backup count, reducing the number of backups otherwise.
|
protected static final Comparator MEMBERID_COMPARATOR
protected static final String MSG_NO_RESULT
protected static final String MSG_NO_PENDING
protected DistributionManager m_manager
protected SimpleAssignmentStrategy.AnalysisContext m_ctxLast
protected Set m_setOwnersLast
protected Map<Ownership,PartitionSet> m_mapSuggestLast
protected SimpleAssignmentStrategy.JMXPartitionStats m_statsPartition
protected boolean m_fRefresh
public DistributionManager getManager()
public SimpleAssignmentStrategy.AnalysisContext getLastAnalysisContext()
public void setLastAnalysisContext(SimpleAssignmentStrategy.AnalysisContext ctx)
ctx
- the AnalysisContextpublic Set getLastOwnershipMembers()
protected void setLastOwnershipMembers(Set setOwners)
setOwners
- the set of ownership-enabled membersprotected long getMemberJoinDelay()
protected long getSuggestionCompletionDelay()
public void init(DistributionManager manager)
analysis
.init
in interface PartitionAssignmentStrategy
manager
- the DistributionManager that this strategy is bound topublic void analyzeOrphans(Map<Member,PartitionSet> mapConstraints)
The strategy must provide suggestions for all orphaned partitions which are consistent with the supplied constraints. Failure to provide a complete set of valid suggestions may result in the loss of partition data.
analyzeOrphans
in interface PartitionAssignmentStrategy
mapConstraints
- the map of assignment constraints associating members with the set of partitions that they could be assigned ownership ofpublic long analyzeDistribution()
As a result of failover, partitions may become 'endangered', meaning that the necessary number of backups do not exist. Failure to suggest a distribution recovery plan for those partitions may result in the partition remaining in the endangered state. Additionally, ownership-enabled service members that are in the process of shutting down will wait until all owned partitions are transferred out. Failure to suggest a distribution plan may delay the exit of these leaving members.
The statistics and ownership information exposed by the DistributionManager will not mutate for the duration of this method call.
analyzeDistribution
in interface PartitionAssignmentStrategy
protected long analyzeDistribution(SimpleAssignmentStrategy.AnalysisContext ctx)
ctx
- the analysis contextanalyzeDistribution()
public String getDescription()
getDescription
in interface PartitionAssignmentStrategy
protected void checkLeaving(SimpleAssignmentStrategy.AnalysisContext ctx)
Partitions owned by leaving members must be transferred to other members before the departing members are able to shutdown.
ctx
- the AnalysisContextprotected void validateBackups(SimpleAssignmentStrategy.AnalysisContext ctx)
ctx
- the AnalysisContextprotected void checkPrimaryBalance(SimpleAssignmentStrategy.AnalysisContext ctx)
ctx
- the analysis contextprotected int doBalancePrimary(SimpleAssignmentStrategy.AnalysisContext ctx, Member memberFrom, PartitionSet parts, Member[] aMembersTarget)
ctx
- the analysis contextmemberFrom
- the member to transfer partitions fromparts
- the set of partitions from which to transferaMembersTarget
- the (unordered) array of membersprotected void checkEndangered(SimpleAssignmentStrategy.AnalysisContext ctx)
A partition is "endangered" if it is incompletely backed up (e.g. some backup copies do not exist).
ctx
- the analysis contextprotected int checkBackupStrong(SimpleAssignmentStrategy.AnalysisContext ctx)
ctx
- the analysis contextprotected int checkBackupBalance(SimpleAssignmentStrategy.AnalysisContext ctx)
ctx
- the analysis contextprotected Member getMember(int nMemberId)
nMemberId
- the mini-idprotected int getVariance(SimpleAssignmentStrategy.AnalysisContext ctx, boolean fPrimary)
ctx
- the analysis contextfPrimary
- true iff the "primary" load variance should be computedprotected static Comparator chainComparators(Comparator comp1, Comparator comp2)
comp1
- the first comparatorcomp2
- the second comparatorprotected static Comparator chainComparators(Comparator comp1, Comparator comp2, Comparator comp3)
comp1
- the first comparatorcomp2
- the second comparatorcomp3
- the third comparatorprotected static int filterSort(Object[] ao, Comparator comparator, Filter filter)
ao
- the object array to sort and filtercomparator
- the comparator to order the elementsfilter
- the filter to use to filter the resultsprotected static int filterSort(Object[] ao, int cElems, Comparator comparator, Filter filter)
ao
- the object array to sort and filtercElems
- the number of elements to filter and sortcomparator
- the comparator to order the elementsfilter
- the filter to use to filter the resultsprotected static int filterArray(Object[] ao, Filter filter)
ao
- the object array to apply the filter tofilter
- the filter to applyprotected static int filterArray(Object[] ao, int cElems, Filter filter)
ao
- the object array to apply the filter tocElems
- the number of elements to filterfilter
- the filter to applypublic int getPartitionCount()
getPartitionCount
in interface SimpleStrategyMBean
public int getBackupCount()
getBackupCount
in interface SimpleStrategyMBean
public int getServiceNodeCount()
getServiceNodeCount
in interface SimpleStrategyMBean
public int getServiceMachineCount()
getServiceMachineCount
in interface SimpleStrategyMBean
public int getServiceRackCount()
getServiceRackCount
in interface SimpleStrategyMBean
public int getServiceSiteCount()
getServiceSiteCount
in interface SimpleStrategyMBean
public String getHAStatus()
getHAStatus
in interface SimpleStrategyMBean
public String getHATarget()
getHATarget
in interface SimpleStrategyMBean
public int getFairShareBackup()
getFairShareBackup
in interface SimpleStrategyMBean
public int getFairSharePrimary()
getFairSharePrimary
in interface SimpleStrategyMBean
public String getStrategyName()
getStrategyName
in interface SimpleStrategyMBean
public Date getLastAnalysisTime()
getLastAnalysisTime
in interface SimpleStrategyMBean
public int getCoordinatorId()
getCoordinatorId
in interface SimpleStrategyMBean
public int getRemainingDistributionCount()
getRemainingDistributionCount
in interface SimpleStrategyMBean
public long getAveragePartitionSizeKB()
getAveragePartitionSizeKB
in interface SimpleStrategyMBean
public long getMaxPartitionSizeKB()
getMaxPartitionSizeKB
in interface SimpleStrategyMBean
public long getMaxStorageSizeKB()
getMaxStorageSizeKB
in interface SimpleStrategyMBean
public long getAverageStorageSizeKB()
getAverageStorageSizeKB
in interface SimpleStrategyMBean
public int getMaxLoadNodeId()
getMaxLoadNodeId
in interface SimpleStrategyMBean
protected SimpleAssignmentStrategy.JMXPartitionStats updateCompositeStats()
public String reportScheduledDistributions(boolean fVerbose)
reportScheduledDistributions
in interface SimpleStrategyMBean
fVerbose
- if true, the report includes partition numbers for each scheduled transferprotected void registerMBean()
This implementation creates and registers a SimpleStrategyMBean
.
protected String makeMBeanName(PartitionedService service)
The name must be globally unique, but not contain the nodeId property. This allows us to re-bind the same JMX name to the MBean on a different node when the distribution coordinator migrates.
service
- partitioned service that uses this strategyprotected void unregisterMBean()
protected void emitLossNotification(PartitionSet partsLost)
partsLost
- the partition id that has been lostprotected Map<Member,PartitionSet[]> collectScheduledDistributions()
protected PartitionSet getUnownedPartitions(PartitionSet parts, int nMember)
parts
- set of partitions to check the ownership ofnMember
- the member-idprotected SortedMap<Integer,PartitionSet> splitByOwner(PartitionSet parts)
parts
- a set of partitions not yet transferredpublic SimpleAssignmentStrategy.LoadCalculator instantiateLoadCalculator(boolean fPrimary)
fPrimary
- true iff the load calculator will be used for primary partition load; backup otherwisepublic SimpleAssignmentStrategy.AnalysisContext instantiateAnalysisContext()