Package org.apache.bookkeeper.client
Class ZoneawareEnsemblePlacementPolicyImpl
- java.lang.Object
- 
- org.apache.bookkeeper.client.TopologyAwareEnsemblePlacementPolicy
- 
- org.apache.bookkeeper.client.ZoneawareEnsemblePlacementPolicyImpl
 
 
- 
- All Implemented Interfaces:
- EnsemblePlacementPolicy,- ITopologyAwareEnsemblePlacementPolicy<BookieNode>
 - Direct Known Subclasses:
- ZoneawareEnsemblePlacementPolicy
 
 public class ZoneawareEnsemblePlacementPolicyImpl extends TopologyAwareEnsemblePlacementPolicy Simple zoneaware ensemble placement policy.
- 
- 
Nested Class SummaryNested Classes Modifier and Type Class Description static classZoneawareEnsemblePlacementPolicyImpl.ZoneAwareNodeLocationZone and UpgradeDomain pair of a node.- 
Nested classes/interfaces inherited from class org.apache.bookkeeper.client.TopologyAwareEnsemblePlacementPolicyTopologyAwareEnsemblePlacementPolicy.DefaultResolver, TopologyAwareEnsemblePlacementPolicy.DNSResolverDecorator, TopologyAwareEnsemblePlacementPolicy.EnsembleForReplacementWithNoConstraints, TopologyAwareEnsemblePlacementPolicy.RRTopologyAwareCoverageEnsemble, TopologyAwareEnsemblePlacementPolicy.TruePredicate
 - 
Nested classes/interfaces inherited from interface org.apache.bookkeeper.client.EnsemblePlacementPolicyEnsemblePlacementPolicy.PlacementPolicyAdherence, EnsemblePlacementPolicy.PlacementResult<T>
 - 
Nested classes/interfaces inherited from interface org.apache.bookkeeper.client.ITopologyAwareEnsemblePlacementPolicyITopologyAwareEnsemblePlacementPolicy.Ensemble<T extends Node>, ITopologyAwareEnsemblePlacementPolicy.Predicate<T extends Node>
 
- 
 - 
Field SummaryFields Modifier and Type Field Description protected java.util.concurrent.ConcurrentMap<BookieId,ZoneawareEnsemblePlacementPolicyImpl.ZoneAwareNodeLocation>address2NodePlacementprotected intdesiredNumZonesPerWriteQuorumprotected booleanenforceStrictZoneawarePlacementprotected CounterfailedToResolveNetworkLocationCounter(package private) static org.slf4j.LoggerLOGprotected intmaxWeightMultipleprotected intminNumZonesPerWriteQuorumprotected BookieNodemyNodeprotected java.lang.StringmyZoneprotected Gauge<java.lang.Integer>numWritableBookiesInDefaultFaultDomainprotected booleanreorderReadsRandomprotected intreorderThresholdPendingRequestsprotected com.google.common.cache.Cache<BookieId,java.lang.Long>slowBookiesprotected intstabilizePeriodSecondsprotected StatsLoggerstatsLoggerprotected io.netty.util.HashedWheelTimertimerstatic java.lang.StringUNKNOWN_ZONEprotected ZoneawareEnsemblePlacementPolicyImpl.ZoneAwareNodeLocationunresolvedNodeLocation- 
Fields inherited from class org.apache.bookkeeper.client.TopologyAwareEnsemblePlacementPolicybookieAddressResolver, bookieInfoMap, bookiesJoinedCounter, bookiesLeftCounter, dnsResolver, historyBookies, isWeighted, knownBookies, readOnlyBookies, REPP_DNS_RESOLVER_CLASS, rwLock, topology, weightedSelection
 
- 
 - 
Constructor SummaryConstructors Constructor Description ZoneawareEnsemblePlacementPolicyImpl()
 - 
Method SummaryAll Methods Instance Methods Concrete Methods Modifier and Type Method Description protected java.util.Set<BookieId>addDefaultFaultDomainBookies(java.util.Set<BookieId> excludeBookies)booleanareAckedBookiesAdheringToPlacementPolicy(java.util.Set<BookieId> ackedBookies, int writeQuorumSize, int ackQuorumSize)Returns true if the bookies that have acknowledged a write adhere to the minimum fault domains as defined in the placement policy in use.java.lang.StringgetDefaultFaultDomain()protected ZoneawareEnsemblePlacementPolicyImpl.ZoneAwareNodeLocationgetZoneAwareNodeLocation(BookieId addr)protected ZoneawareEnsemblePlacementPolicyImpl.ZoneAwareNodeLocationgetZoneAwareNodeLocation(BookieNode node)EnsemblePlacementPolicyinitialize(ClientConfiguration conf, java.util.Optional<DNSToSwitchMapping> optionalDnsResolver, io.netty.util.HashedWheelTimer timer, FeatureProvider featureProvider, StatsLogger statsLogger, BookieAddressResolver bookieAddressResolver)Initialize the policy.EnsemblePlacementPolicy.PlacementPolicyAdherenceisEnsembleAdheringToPlacementPolicy(java.util.List<BookieId> ensembleList, int writeQuorumSize, int ackQuorumSize)returns AdherenceLevel if the Ensemble is strictly/softly/fails adhering to placement policy, like in the case of RackawareEnsemblePlacementPolicy, bookies in the writeset are from 'minNumRacksPerWriteQuorum' number of racks.EnsemblePlacementPolicy.PlacementResult<java.util.List<BookieId>>newEnsemble(int ensembleSize, int writeQuorumSize, int ackQuorumSize, java.util.Map<java.lang.String,byte[]> customMetadata, java.util.Set<BookieId> excludeBookies)Choose numBookies bookies for ensemble.EnsemblePlacementPolicy.PlacementResult<java.util.List<BookieId>>newEnsemble(int ensembleSize, int writeQuorumSize, int ackQuorumSize, java.util.Set<BookieId> excludeBookies, ITopologyAwareEnsemblePlacementPolicy.Ensemble<BookieNode> parentEnsemble, ITopologyAwareEnsemblePlacementPolicy.Predicate<BookieNode> parentPredicate)Create an ensemble with parent ensemble.voidregisterSlowBookie(BookieId bookieSocketAddress, long entryId)Register a bookie as slow so that it is tried after available and read-only bookies.DistributionSchedule.WriteSetreorderReadLACSequence(java.util.List<BookieId> ensemble, BookiesHealthInfo bookiesHealthInfo, DistributionSchedule.WriteSet writeSet)Reorder the read last add confirmed sequence of a given write quorum writeSet.DistributionSchedule.WriteSetreorderReadSequence(java.util.List<BookieId> ensemble, BookiesHealthInfo bookiesHealthInfo, DistributionSchedule.WriteSet writeSet)Reorder the read sequence of a given write quorum writeSet.EnsemblePlacementPolicy.PlacementResult<BookieId>replaceBookie(int ensembleSize, int writeQuorumSize, int ackQuorumSize, java.util.Map<java.lang.String,byte[]> customMetadata, java.util.List<BookieId> currentEnsemble, BookieId bookieToReplace, java.util.Set<BookieId> excludeBookies)Choose a new bookie to replace bookieToReplace.BookieNodeselectFromNetworkLocation(java.lang.String networkLoc, java.util.Set<java.lang.String> excludeRacks, java.util.Set<Node> excludeBookies, ITopologyAwareEnsemblePlacementPolicy.Predicate<BookieNode> predicate, ITopologyAwareEnsemblePlacementPolicy.Ensemble<BookieNode> ensemble, boolean fallbackToRandom)Select a node from networkLoc rack excluding excludeBookies.BookieNodeselectFromNetworkLocation(java.lang.String networkLoc, java.util.Set<Node> excludeBookies, ITopologyAwareEnsemblePlacementPolicy.Predicate<BookieNode> predicate, ITopologyAwareEnsemblePlacementPolicy.Ensemble<BookieNode> ensemble, boolean fallbackToRandom)Select a node from a given network location.BookieNodeselectFromNetworkLocation(java.util.Set<java.lang.String> excludeRacks, java.util.Set<Node> excludeBookies, ITopologyAwareEnsemblePlacementPolicy.Predicate<BookieNode> predicate, ITopologyAwareEnsemblePlacementPolicy.Ensemble<BookieNode> ensemble, boolean fallbackToRandom)Select a node from cluster excluding excludeBookies and bookie nodes of excludeRacks.voiduninitalize()Uninitialize the policy.ZoneawareEnsemblePlacementPolicyImplwithDefaultFaultDomain(java.lang.String defaultFaultDomain)- 
Methods inherited from class org.apache.bookkeeper.client.TopologyAwareEnsemblePlacementPolicyconvertBookiesToNodes, convertBookieToNode, createBookieNode, createDummyLocalBookieNode, differBetweenBookies, getDefaultRack, getNetworkLocations, handleBookiesThatJoined, handleBookiesThatLeft, onBookieRackChange, onClusterChanged, resolveNetworkLocation, shuffleWithMask, updateBookieInfo
 - 
Methods inherited from class java.lang.Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 - 
Methods inherited from interface org.apache.bookkeeper.client.EnsemblePlacementPolicygetStickyReadBookieIndex, replaceToAdherePlacementPolicy
 
- 
 
- 
- 
- 
Field Detail- 
LOGstatic final org.slf4j.Logger LOG 
 - 
UNKNOWN_ZONEpublic static final java.lang.String UNKNOWN_ZONE - See Also:
- Constant Field Values
 
 - 
unresolvedNodeLocationprotected ZoneawareEnsemblePlacementPolicyImpl.ZoneAwareNodeLocation unresolvedNodeLocation 
 - 
statsLoggerprotected StatsLogger statsLogger 
 - 
slowBookiesprotected com.google.common.cache.Cache<BookieId,java.lang.Long> slowBookies 
 - 
myNodeprotected BookieNode myNode 
 - 
myZoneprotected java.lang.String myZone 
 - 
reorderReadsRandomprotected boolean reorderReadsRandom 
 - 
stabilizePeriodSecondsprotected int stabilizePeriodSeconds 
 - 
reorderThresholdPendingRequestsprotected int reorderThresholdPendingRequests 
 - 
maxWeightMultipleprotected int maxWeightMultiple 
 - 
minNumZonesPerWriteQuorumprotected int minNumZonesPerWriteQuorum 
 - 
desiredNumZonesPerWriteQuorumprotected int desiredNumZonesPerWriteQuorum 
 - 
enforceStrictZoneawarePlacementprotected boolean enforceStrictZoneawarePlacement 
 - 
timerprotected io.netty.util.HashedWheelTimer timer 
 - 
address2NodePlacementprotected final java.util.concurrent.ConcurrentMap<BookieId,ZoneawareEnsemblePlacementPolicyImpl.ZoneAwareNodeLocation> address2NodePlacement 
 - 
failedToResolveNetworkLocationCounter@StatsDoc(name="FAILED_TO_RESOLVE_NETWORK_LOCATION_TOTAL", help="Counter for number of times DNSResolverDecorator failed to resolve Network Location") protected Counter failedToResolveNetworkLocationCounter 
 
- 
 - 
Method Detail- 
getZoneAwareNodeLocationprotected ZoneawareEnsemblePlacementPolicyImpl.ZoneAwareNodeLocation getZoneAwareNodeLocation(BookieId addr) 
 - 
getZoneAwareNodeLocationprotected ZoneawareEnsemblePlacementPolicyImpl.ZoneAwareNodeLocation getZoneAwareNodeLocation(BookieNode node) 
 - 
initializepublic EnsemblePlacementPolicy initialize(ClientConfiguration conf, java.util.Optional<DNSToSwitchMapping> optionalDnsResolver, io.netty.util.HashedWheelTimer timer, FeatureProvider featureProvider, StatsLogger statsLogger, BookieAddressResolver bookieAddressResolver) Description copied from interface:EnsemblePlacementPolicyInitialize the policy.- Parameters:
- conf- client configuration
- optionalDnsResolver- dns resolver
- timer- timer
- featureProvider- feature provider
- statsLogger- stats logger
 
 - 
withDefaultFaultDomainpublic ZoneawareEnsemblePlacementPolicyImpl withDefaultFaultDomain(java.lang.String defaultFaultDomain) 
 - 
getDefaultFaultDomainpublic java.lang.String getDefaultFaultDomain() 
 - 
newEnsemblepublic EnsemblePlacementPolicy.PlacementResult<java.util.List<BookieId>> newEnsemble(int ensembleSize, int writeQuorumSize, int ackQuorumSize, java.util.Set<BookieId> excludeBookies, ITopologyAwareEnsemblePlacementPolicy.Ensemble<BookieNode> parentEnsemble, ITopologyAwareEnsemblePlacementPolicy.Predicate<BookieNode> parentPredicate) throws BKException.BKNotEnoughBookiesException Description copied from interface:ITopologyAwareEnsemblePlacementPolicyCreate an ensemble with parent ensemble.- Parameters:
- ensembleSize- ensemble size
- writeQuorumSize- write quorum size
- ackQuorumSize- ack quorum size
- excludeBookies- exclude bookies
- parentEnsemble- parent ensemble
- Returns:
- list of bookies forming the ensemble
- Throws:
- BKException.BKNotEnoughBookiesException
 
 - 
selectFromNetworkLocationpublic BookieNode selectFromNetworkLocation(java.lang.String networkLoc, java.util.Set<Node> excludeBookies, ITopologyAwareEnsemblePlacementPolicy.Predicate<BookieNode> predicate, ITopologyAwareEnsemblePlacementPolicy.Ensemble<BookieNode> ensemble, boolean fallbackToRandom) throws BKException.BKNotEnoughBookiesException Description copied from interface:ITopologyAwareEnsemblePlacementPolicySelect a node from a given network location.- Parameters:
- networkLoc- network location
- excludeBookies- exclude bookies set
- predicate- predicate to apply
- ensemble- ensemble
- fallbackToRandom- fallbackToRandom
- Returns:
- the selected bookie.
- Throws:
- BKException.BKNotEnoughBookiesException
 
 - 
selectFromNetworkLocationpublic BookieNode selectFromNetworkLocation(java.util.Set<java.lang.String> excludeRacks, java.util.Set<Node> excludeBookies, ITopologyAwareEnsemblePlacementPolicy.Predicate<BookieNode> predicate, ITopologyAwareEnsemblePlacementPolicy.Ensemble<BookieNode> ensemble, boolean fallbackToRandom) throws BKException.BKNotEnoughBookiesException Description copied from interface:ITopologyAwareEnsemblePlacementPolicySelect a node from cluster excluding excludeBookies and bookie nodes of excludeRacks. If there isn't a BookieNode excluding those racks and nodes, then if fallbackToRandom is set to true then pick a random node from cluster just excluding excludeBookies.- Returns:
- Throws:
- BKException.BKNotEnoughBookiesException
 
 - 
selectFromNetworkLocationpublic BookieNode selectFromNetworkLocation(java.lang.String networkLoc, java.util.Set<java.lang.String> excludeRacks, java.util.Set<Node> excludeBookies, ITopologyAwareEnsemblePlacementPolicy.Predicate<BookieNode> predicate, ITopologyAwareEnsemblePlacementPolicy.Ensemble<BookieNode> ensemble, boolean fallbackToRandom) throws BKException.BKNotEnoughBookiesException Description copied from interface:ITopologyAwareEnsemblePlacementPolicySelect a node from networkLoc rack excluding excludeBookies. If there isn't any node in 'networkLoc', then it will try to get a node from cluster excluding excludeRacks and excludeBookies. If fallbackToRandom is set to true then it will get a random bookie from cluster excluding excludeBookies if it couldn't find a bookie- Returns:
- Throws:
- BKException.BKNotEnoughBookiesException
 
 - 
uninitalizepublic void uninitalize() Description copied from interface:EnsemblePlacementPolicyUninitialize the policy.
 - 
newEnsemblepublic EnsemblePlacementPolicy.PlacementResult<java.util.List<BookieId>> newEnsemble(int ensembleSize, int writeQuorumSize, int ackQuorumSize, java.util.Map<java.lang.String,byte[]> customMetadata, java.util.Set<BookieId> excludeBookies) throws BKException.BKNotEnoughBookiesException Description copied from interface:EnsemblePlacementPolicyChoose numBookies bookies for ensemble. If the count is more than the number of available nodes,BKException.BKNotEnoughBookiesExceptionis thrown.The implementation should respect to the replace settings. The size of the returned bookie list should be equal to the provide ensembleSize.customMetadatais the same user defined data that user provides whenBookKeeper.createLedger(int, int, int, BookKeeper.DigestType, byte[], Map).If 'enforceMinNumRacksPerWriteQuorum' config is enabled then the bookies belonging to default faultzone (rack) will be excluded while selecting bookies. - Parameters:
- ensembleSize- Ensemble Size
- writeQuorumSize- Write Quorum Size
- ackQuorumSize- the value of ackQuorumSize (added since 4.5)
- customMetadata- the value of customMetadata. it is the same user defined metadata that user provides in- BookKeeper.createLedger(int, int, int, BookKeeper.DigestType, byte[])
- excludeBookies- Bookies that should not be considered as targets.
- Returns:
- a placement result containing list of bookie addresses for the ensemble.
- Throws:
- BKException.BKNotEnoughBookiesException- if not enough bookies available.
 
 - 
replaceBookiepublic EnsemblePlacementPolicy.PlacementResult<BookieId> replaceBookie(int ensembleSize, int writeQuorumSize, int ackQuorumSize, java.util.Map<java.lang.String,byte[]> customMetadata, java.util.List<BookieId> currentEnsemble, BookieId bookieToReplace, java.util.Set<BookieId> excludeBookies) throws BKException.BKNotEnoughBookiesException Description copied from interface:EnsemblePlacementPolicyChoose a new bookie to replace bookieToReplace. If no bookie available in the cluster,BKException.BKNotEnoughBookiesExceptionis thrown.If 'enforceMinNumRacksPerWriteQuorum' config is enabled then the bookies belonging to default faultzone (rack) will be excluded while selecting bookies. - Parameters:
- ensembleSize- the value of ensembleSize
- writeQuorumSize- the value of writeQuorumSize
- ackQuorumSize- the value of ackQuorumSize (added since 4.5)
- customMetadata- the value of customMetadata. it is the same user defined metadata that user provides in- BookKeeper.createLedger(int, int, int, BookKeeper.DigestType, byte[])
- currentEnsemble- the value of currentEnsemble
- bookieToReplace- bookie to replace
- excludeBookies- bookies that should not be considered as candidate.
- Returns:
- a placement result containing the new bookie address.
- Throws:
- BKException.BKNotEnoughBookiesException
 
 - 
addDefaultFaultDomainBookiesprotected java.util.Set<BookieId> addDefaultFaultDomainBookies(java.util.Set<BookieId> excludeBookies) 
 - 
registerSlowBookiepublic void registerSlowBookie(BookieId bookieSocketAddress, long entryId) Description copied from interface:EnsemblePlacementPolicyRegister a bookie as slow so that it is tried after available and read-only bookies.- Parameters:
- bookieSocketAddress- Address of bookie host
- entryId- Entry ID that caused a speculative timeout on the bookie.
 
 - 
reorderReadSequencepublic DistributionSchedule.WriteSet reorderReadSequence(java.util.List<BookieId> ensemble, BookiesHealthInfo bookiesHealthInfo, DistributionSchedule.WriteSet writeSet) Description copied from interface:EnsemblePlacementPolicyReorder the read sequence of a given write quorum writeSet.- Specified by:
- reorderReadSequencein interface- EnsemblePlacementPolicy
- Overrides:
- reorderReadSequencein class- TopologyAwareEnsemblePlacementPolicy
- Parameters:
- ensemble- Ensemble to read entries.
- bookiesHealthInfo- Health info for bookies
- writeSet- Write quorum to read entries. This will be modified, rather than allocating a new WriteSet.
- Returns:
- The read sequence. This will be the same object as the passed in writeSet.
 
 - 
reorderReadLACSequencepublic DistributionSchedule.WriteSet reorderReadLACSequence(java.util.List<BookieId> ensemble, BookiesHealthInfo bookiesHealthInfo, DistributionSchedule.WriteSet writeSet) Description copied from interface:EnsemblePlacementPolicyReorder the read last add confirmed sequence of a given write quorum writeSet.- Specified by:
- reorderReadLACSequencein interface- EnsemblePlacementPolicy
- Overrides:
- reorderReadLACSequencein class- TopologyAwareEnsemblePlacementPolicy
- Parameters:
- ensemble- Ensemble to read entries.
- bookiesHealthInfo- Health info for bookies
- writeSet- Write quorum to read entries. This will be modified, rather than allocating a new WriteSet.
- Returns:
- The read sequence. This will be the same object as the passed in writeSet.
 
 - 
isEnsembleAdheringToPlacementPolicypublic EnsemblePlacementPolicy.PlacementPolicyAdherence isEnsembleAdheringToPlacementPolicy(java.util.List<BookieId> ensembleList, int writeQuorumSize, int ackQuorumSize) Description copied from interface:EnsemblePlacementPolicyreturns AdherenceLevel if the Ensemble is strictly/softly/fails adhering to placement policy, like in the case of RackawareEnsemblePlacementPolicy, bookies in the writeset are from 'minNumRacksPerWriteQuorum' number of racks. And in the case of RegionawareEnsemblePlacementPolicy, check for minimumRegionsForDurability, reppRegionsToWrite, rack distribution within a region and other parameters of RegionAwareEnsemblePlacementPolicy. In ZoneAwareEnsemblePlacementPolicy if bookies in the writeset are from 'desiredNumOfZones' then it is considered as MEETS_STRICT if they are from 'minNumOfZones' then it is considered as MEETS_SOFT otherwise considered as FAIL.- Parameters:
- ensembleList- list of BookieId of bookies in the ensemble
- writeQuorumSize- writeQuorumSize of the ensemble
- ackQuorumSize- ackQuorumSize of the ensemble
- Returns:
 
 - 
areAckedBookiesAdheringToPlacementPolicypublic boolean areAckedBookiesAdheringToPlacementPolicy(java.util.Set<BookieId> ackedBookies, int writeQuorumSize, int ackQuorumSize) Description copied from interface:EnsemblePlacementPolicyReturns true if the bookies that have acknowledged a write adhere to the minimum fault domains as defined in the placement policy in use. Ex: In the case of RackawareEnsemblePlacementPolicy, bookies belong to at least 'minNumRacksPerWriteQuorum' number of racks.- Parameters:
- ackedBookies- list of BookieId of bookies that have acknowledged a write.
- writeQuorumSize- writeQuorumSize of the ensemble
- ackQuorumSize- ackQuorumSize of the ensemble
- Returns:
 
 
- 
 
-