Package org.apache.bookkeeper.meta
Class ZkLedgerUnderreplicationManager
- java.lang.Object
-
- org.apache.bookkeeper.meta.ZkLedgerUnderreplicationManager
-
- All Implemented Interfaces:
java.lang.AutoCloseable,LedgerUnderreplicationManager
public class ZkLedgerUnderreplicationManager extends java.lang.Object implements LedgerUnderreplicationManager
ZooKeeper implementation of underreplication manager. This is implemented in a hierarchical fashion, so it'll work with FlatLedgerManagerFactory and HierarchicalLedgerManagerFactory.Layout is: /root/underreplication/ LAYOUT ledgers/(hierarchicalpath)/urL(ledgerId) locks/(ledgerId)
The hierarchical path is created by splitting the ledger into 4 2byte segments which are represented in hexadecimal. e.g. For ledger id 0xcafebeef0000feed, the path is cafe/beef/0000/feed/
-
-
Field Summary
Fields Modifier and Type Field Description (package private) static java.lang.StringLAYOUT(package private) static intLAYOUT_VERSION(package private) static org.slf4j.LoggerLOG
-
Constructor Summary
Constructors Constructor Description ZkLedgerUnderreplicationManager(AbstractConfiguration conf, org.apache.zookeeper.ZooKeeper zkc)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description voidacquireUnderreplicatedLedger(long ledgerId)static java.lang.StringacquireUnderreplicatedLedgerLock(org.apache.zookeeper.ZooKeeper zkc, java.lang.String zkLedgersRootPath, long ledgerId, java.util.List<org.apache.zookeeper.data.ACL> zkAcls)Acquire the underreplicated ledger lock.voidclose()Release all resources held by the ledger underreplication manager.voiddisableLedgerReplication()Stop ledger replication.voidenableLedgerReplication()Resuming ledger replication.static java.lang.StringgetBasePath(java.lang.String rootPath)longgetCheckAllLedgersCTime()Getter for the CheckAllLedgers last executed ctime.longgetLedgerToRereplicate()Acquire a underreplicated ledger for rereplication.UnderreplicatedLedgergetLedgerUnreplicationInfo(long ledgerId)Get the UnderreplicatedLedger info if this ledger is marked underreplicated otherwise it returns null.static byte[]getLockData()intgetLostBookieRecoveryDelay()Getter for the lostBookieRecoveryDelay.static java.lang.StringgetParentZnodePath(java.lang.String base, long ledgerId)longgetPlacementPolicyCheckCTime()Getter for the PlacementPolicyCheck last executed ctime.longgetReplicasCheckCTime()Getter for the ReplicasCheck last executed ctime.java.lang.StringgetReplicationWorkerIdRereplicatingLedger(long ledgerId)If a replicationworker has acquired lock on an underreplicated ledger, then getReplicationWorkerIdRereplicatingLedger should return ReplicationWorkerId (BookieId) of the ReplicationWorker that is holding lock.static java.lang.StringgetUrLedgerLockZnode(java.lang.String base, long ledgerId)static java.lang.StringgetUrLedgerZnode(java.lang.String base, long ledgerId)static java.lang.StringgetUrLockPath(java.lang.String rootPath)booleaninitializeLostBookieRecoveryDelay(int lostBookieRecoveryDelay)Creates the zNode for lostBookieRecoveryDelay with the specified value and returns true.booleanisLedgerBeingReplicated(long ledgerId)Check whether the ledger is being replicated by any bookie.booleanisLedgerReplicationEnabled()Check whether the ledger replication is enabled or not.java.util.Iterator<UnderreplicatedLedger>listLedgersToRereplicate(java.util.function.Predicate<java.util.List<java.lang.String>> predicate)Get a list of all the underreplicated ledgers which have been marked for rereplication, filtered by the predicate on the replicas list.voidmarkLedgerReplicated(long ledgerId)Mark a ledger as fully replicated.java.util.concurrent.CompletableFuture<java.lang.Void>markLedgerUnderreplicatedAsync(long ledgerId, java.util.Collection<java.lang.String> missingReplicas)Mark a ledger as underreplicated with missing bookies.voidnotifyLedgerReplicationEnabled(BookkeeperInternalCallbacks.GenericCallback<java.lang.Void> cb)Receive notification asynchronously when the ledger replication process is enabled.voidnotifyLostBookieRecoveryDelayChanged(BookkeeperInternalCallbacks.GenericCallback<java.lang.Void> cb)Receive notification asynchronously when the lostBookieRecoveryDelay value is Changed.voidnotifyUnderReplicationLedgerChanged(BookkeeperInternalCallbacks.GenericCallback<java.lang.Void> cb)Receive notification asynchronously when the num of under-replicated ledgers Changed.longpollLedgerToRereplicate()Poll for a underreplicated ledger to rereplicate.voidreleaseUnderreplicatedLedger(long ledgerId)Release a previously acquired ledger.voidsetCheckAllLedgersCTime(long checkAllLedgersCTime)Setter for the CheckAllLedgers last executed ctime.voidsetLostBookieRecoveryDelay(int lostBookieRecoveryDelay)Setter for the lostBookieRecoveryDelay znode.voidsetPlacementPolicyCheckCTime(long placementPolicyCheckCTime)Setter for the PlacementPolicyCheck last executed ctime.voidsetReplicasCheckCTime(long replicasCheckCTime)Setter for the ReplicasCheck last executed ctime.-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.apache.bookkeeper.meta.LedgerUnderreplicationManager
markLedgerUnderreplicated
-
-
-
-
Field Detail
-
LOG
static final org.slf4j.Logger LOG
-
LAYOUT
static final java.lang.String LAYOUT
- See Also:
- Constant Field Values
-
LAYOUT_VERSION
static final int LAYOUT_VERSION
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
ZkLedgerUnderreplicationManager
public ZkLedgerUnderreplicationManager(AbstractConfiguration conf, org.apache.zookeeper.ZooKeeper zkc) throws ReplicationException.UnavailableException, java.lang.InterruptedException, ReplicationException.CompatibilityException
- Throws:
ReplicationException.UnavailableExceptionjava.lang.InterruptedExceptionReplicationException.CompatibilityException
-
-
Method Detail
-
getBasePath
public static java.lang.String getBasePath(java.lang.String rootPath)
-
getUrLockPath
public static java.lang.String getUrLockPath(java.lang.String rootPath)
-
getLockData
public static byte[] getLockData()
-
getParentZnodePath
public static java.lang.String getParentZnodePath(java.lang.String base, long ledgerId)
-
getUrLedgerZnode
public static java.lang.String getUrLedgerZnode(java.lang.String base, long ledgerId)
-
getUrLedgerLockZnode
public static java.lang.String getUrLedgerLockZnode(java.lang.String base, long ledgerId)
-
getLedgerUnreplicationInfo
public UnderreplicatedLedger getLedgerUnreplicationInfo(long ledgerId) throws ReplicationException.UnavailableException
Description copied from interface:LedgerUnderreplicationManagerGet the UnderreplicatedLedger info if this ledger is marked underreplicated otherwise it returns null.- Specified by:
getLedgerUnreplicationInfoin interfaceLedgerUnderreplicationManager- Parameters:
ledgerId- ledger id- Returns:
- the UnderreplicatedLedger info instance if this ledger is marked underreplicated otherwise it returns null.
- Throws:
ReplicationException.UnavailableException
-
markLedgerUnderreplicatedAsync
public java.util.concurrent.CompletableFuture<java.lang.Void> markLedgerUnderreplicatedAsync(long ledgerId, java.util.Collection<java.lang.String> missingReplicas)Description copied from interface:LedgerUnderreplicationManagerMark a ledger as underreplicated with missing bookies. The replication should then check which fragments are underreplicated and rereplicate them.- Specified by:
markLedgerUnderreplicatedAsyncin interfaceLedgerUnderreplicationManager- Parameters:
ledgerId- ledger idmissingReplicas- missing replicas- Returns:
- a future presents the mark result.
-
markLedgerReplicated
public void markLedgerReplicated(long ledgerId) throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerMark a ledger as fully replicated. If the ledger is not already marked as underreplicated, this is a noop.- Specified by:
markLedgerReplicatedin interfaceLedgerUnderreplicationManager- Throws:
ReplicationException.UnavailableException
-
listLedgersToRereplicate
public java.util.Iterator<UnderreplicatedLedger> listLedgersToRereplicate(java.util.function.Predicate<java.util.List<java.lang.String>> predicate)
Get a list of all the underreplicated ledgers which have been marked for rereplication, filtered by the predicate on the replicas list.Replicas list of an underreplicated ledger is the list of the bookies which are part of the ensemble of this ledger and are currently unavailable/down.
- Specified by:
listLedgersToRereplicatein interfaceLedgerUnderreplicationManager- Parameters:
predicate- filter to use while listing under replicated ledgers. 'null' if filtering is not required.- Returns:
- an iterator which returns underreplicated ledgers.
-
pollLedgerToRereplicate
public long pollLedgerToRereplicate() throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerPoll for a underreplicated ledger to rereplicate.- Specified by:
pollLedgerToRereplicatein interfaceLedgerUnderreplicationManager- Returns:
- the ledgerId, or -1 if none are available
- Throws:
ReplicationException.UnavailableException- See Also:
LedgerUnderreplicationManager.getLedgerToRereplicate()
-
getLedgerToRereplicate
public long getLedgerToRereplicate() throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerAcquire a underreplicated ledger for rereplication. The ledger should be locked, so that no other agent will receive the ledger from this call. The ledger should remain locked until either #markLedgerComplete or #releaseLedger are called. This call is blocking, so will not return until a ledger is available for rereplication.- Specified by:
getLedgerToRereplicatein interfaceLedgerUnderreplicationManager- Throws:
ReplicationException.UnavailableException
-
releaseUnderreplicatedLedger
public void releaseUnderreplicatedLedger(long ledgerId) throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerRelease a previously acquired ledger. This allows others to acquire the ledger.- Specified by:
releaseUnderreplicatedLedgerin interfaceLedgerUnderreplicationManager- Throws:
ReplicationException.UnavailableException
-
close
public void close() throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerRelease all resources held by the ledger underreplication manager.- Specified by:
closein interfacejava.lang.AutoCloseable- Specified by:
closein interfaceLedgerUnderreplicationManager- Throws:
ReplicationException.UnavailableException
-
disableLedgerReplication
public void disableLedgerReplication() throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerStop ledger replication. Currently running ledger rereplication tasks will be continued and will be stopped from next task. This will block ledger replication#AuditorandLedgerUnderreplicationManager.getLedgerToRereplicate()tasks.- Specified by:
disableLedgerReplicationin interfaceLedgerUnderreplicationManager- Throws:
ReplicationException.UnavailableException
-
enableLedgerReplication
public void enableLedgerReplication() throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerResuming ledger replication. This will allow ledger replication#AuditorandLedgerUnderreplicationManager.getLedgerToRereplicate()tasks to continue.- Specified by:
enableLedgerReplicationin interfaceLedgerUnderreplicationManager- Throws:
ReplicationException.UnavailableException
-
isLedgerReplicationEnabled
public boolean isLedgerReplicationEnabled() throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerCheck whether the ledger replication is enabled or not. This will return true if the ledger replication is enabled, otherwise return false.- Specified by:
isLedgerReplicationEnabledin interfaceLedgerUnderreplicationManager- Returns:
- - return true if it is enabled otherwise return false
- Throws:
ReplicationException.UnavailableException
-
notifyLedgerReplicationEnabled
public void notifyLedgerReplicationEnabled(BookkeeperInternalCallbacks.GenericCallback<java.lang.Void> cb) throws ReplicationException.UnavailableException
Description copied from interface:LedgerUnderreplicationManagerReceive notification asynchronously when the ledger replication process is enabled.- Specified by:
notifyLedgerReplicationEnabledin interfaceLedgerUnderreplicationManager- Parameters:
cb- - callback implementation to receive the notification- Throws:
ReplicationException.UnavailableException
-
isLedgerBeingReplicated
public boolean isLedgerBeingReplicated(long ledgerId) throws ReplicationExceptionCheck whether the ledger is being replicated by any bookie.- Specified by:
isLedgerBeingReplicatedin interfaceLedgerUnderreplicationManager- Throws:
ReplicationException
-
acquireUnderreplicatedLedgerLock
public static java.lang.String acquireUnderreplicatedLedgerLock(org.apache.zookeeper.ZooKeeper zkc, java.lang.String zkLedgersRootPath, long ledgerId, java.util.List<org.apache.zookeeper.data.ACL> zkAcls) throws ReplicationException.UnavailableException, java.lang.InterruptedExceptionAcquire the underreplicated ledger lock.- Throws:
ReplicationException.UnavailableExceptionjava.lang.InterruptedException
-
acquireUnderreplicatedLedger
public void acquireUnderreplicatedLedger(long ledgerId) throws ReplicationException- Specified by:
acquireUnderreplicatedLedgerin interfaceLedgerUnderreplicationManager- Throws:
ReplicationException
-
initializeLostBookieRecoveryDelay
public boolean initializeLostBookieRecoveryDelay(int lostBookieRecoveryDelay) throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerCreates the zNode for lostBookieRecoveryDelay with the specified value and returns true. If the node is already existing, then it returns false.- Specified by:
initializeLostBookieRecoveryDelayin interfaceLedgerUnderreplicationManager- Returns:
- true if it succeeds in creating zNode for lostBookieRecoveryDelay, false if it is already existing
- Throws:
ReplicationException.UnavailableException
-
setLostBookieRecoveryDelay
public void setLostBookieRecoveryDelay(int lostBookieRecoveryDelay) throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerSetter for the lostBookieRecoveryDelay znode.- Specified by:
setLostBookieRecoveryDelayin interfaceLedgerUnderreplicationManager- Throws:
ReplicationException.UnavailableException
-
getLostBookieRecoveryDelay
public int getLostBookieRecoveryDelay() throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerGetter for the lostBookieRecoveryDelay.- Specified by:
getLostBookieRecoveryDelayin interfaceLedgerUnderreplicationManager- Returns:
- the int value of lostBookieRecoveryDelay
- Throws:
ReplicationException.UnavailableException
-
notifyUnderReplicationLedgerChanged
public void notifyUnderReplicationLedgerChanged(BookkeeperInternalCallbacks.GenericCallback<java.lang.Void> cb) throws ReplicationException.UnavailableException
Description copied from interface:LedgerUnderreplicationManagerReceive notification asynchronously when the num of under-replicated ledgers Changed.- Specified by:
notifyUnderReplicationLedgerChangedin interfaceLedgerUnderreplicationManager- Throws:
ReplicationException.UnavailableException
-
notifyLostBookieRecoveryDelayChanged
public void notifyLostBookieRecoveryDelayChanged(BookkeeperInternalCallbacks.GenericCallback<java.lang.Void> cb) throws ReplicationException.UnavailableException
Description copied from interface:LedgerUnderreplicationManagerReceive notification asynchronously when the lostBookieRecoveryDelay value is Changed.- Specified by:
notifyLostBookieRecoveryDelayChangedin interfaceLedgerUnderreplicationManager- Throws:
ReplicationException.UnavailableException
-
getReplicationWorkerIdRereplicatingLedger
public java.lang.String getReplicationWorkerIdRereplicatingLedger(long ledgerId) throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerIf a replicationworker has acquired lock on an underreplicated ledger, then getReplicationWorkerIdRereplicatingLedger should return ReplicationWorkerId (BookieId) of the ReplicationWorker that is holding lock. If lock for the underreplicated ledger is not yet acquired or if it is released then it is supposed to return null.- Specified by:
getReplicationWorkerIdRereplicatingLedgerin interfaceLedgerUnderreplicationManager- Returns:
- Throws:
ReplicationException.UnavailableException
-
setCheckAllLedgersCTime
public void setCheckAllLedgersCTime(long checkAllLedgersCTime) throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerSetter for the CheckAllLedgers last executed ctime.- Specified by:
setCheckAllLedgersCTimein interfaceLedgerUnderreplicationManager- Throws:
ReplicationException.UnavailableException
-
getCheckAllLedgersCTime
public long getCheckAllLedgersCTime() throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerGetter for the CheckAllLedgers last executed ctime.- Specified by:
getCheckAllLedgersCTimein interfaceLedgerUnderreplicationManager- Returns:
- the long value of checkAllLedgersCTime
- Throws:
ReplicationException.UnavailableException
-
setPlacementPolicyCheckCTime
public void setPlacementPolicyCheckCTime(long placementPolicyCheckCTime) throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerSetter for the PlacementPolicyCheck last executed ctime.- Specified by:
setPlacementPolicyCheckCTimein interfaceLedgerUnderreplicationManager- Throws:
ReplicationException.UnavailableException
-
getPlacementPolicyCheckCTime
public long getPlacementPolicyCheckCTime() throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerGetter for the PlacementPolicyCheck last executed ctime.- Specified by:
getPlacementPolicyCheckCTimein interfaceLedgerUnderreplicationManager- Returns:
- the long value of placementPolicyCheckCTime
- Throws:
ReplicationException.UnavailableException
-
setReplicasCheckCTime
public void setReplicasCheckCTime(long replicasCheckCTime) throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerSetter for the ReplicasCheck last executed ctime.- Specified by:
setReplicasCheckCTimein interfaceLedgerUnderreplicationManager- Throws:
ReplicationException.UnavailableException
-
getReplicasCheckCTime
public long getReplicasCheckCTime() throws ReplicationException.UnavailableExceptionDescription copied from interface:LedgerUnderreplicationManagerGetter for the ReplicasCheck last executed ctime.- Specified by:
getReplicasCheckCTimein interfaceLedgerUnderreplicationManager- Returns:
- the long value of replicasCheckCTime
- Throws:
ReplicationException.UnavailableException
-
-