Class DbLedgerStorage
- java.lang.Object
-
- org.apache.bookkeeper.bookie.storage.ldb.DbLedgerStorage
-
- All Implemented Interfaces:
LedgerStorage
public class DbLedgerStorage extends java.lang.Object implements LedgerStorage
Implementation of LedgerStorage that uses RocksDB to keep the indexes for entries stored in EntryLogs.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface org.apache.bookkeeper.bookie.LedgerStorage
LedgerStorage.DetectedInconsistency, LedgerStorage.LedgerDeletionListener, LedgerStorage.StorageState
-
-
Field Summary
Fields Modifier and Type Field Description protected io.netty.buffer.ByteBufAllocator
allocator
static java.lang.String
DIRECT_IO_ENTRYLOGGER
static java.lang.String
DIRECT_IO_ENTRYLOGGER_MAX_FD_CACHE_TIME_SECONDS
static java.lang.String
DIRECT_IO_ENTRYLOGGER_READBUFFER_SIZE_MB
static java.lang.String
DIRECT_IO_ENTRYLOGGER_TOTAL_READBUFFER_SIZE_MB
static java.lang.String
DIRECT_IO_ENTRYLOGGER_TOTAL_WRITEBUFFER_SIZE_MB
(package private) static java.lang.String
MAX_THROTTLE_TIME_MILLIS
(package private) static java.lang.String
READ_AHEAD_CACHE_BATCH_BYTES_SIZE
(package private) static java.lang.String
READ_AHEAD_CACHE_BATCH_SIZE
static java.lang.String
READ_AHEAD_CACHE_MAX_SIZE_MB
static java.lang.String
WRITE_CACHE_MAX_SIZE_MB
-
Constructor Summary
Constructors Constructor Description DbLedgerStorage()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description long
addEntry(io.netty.buffer.ByteBuf entry)
Add an entry to the storage.long
addLedgerToIndex(long ledgerId, boolean isFenced, byte[] masterKey, LedgerCache.PageEntriesIterable pages)
void
cancelWaitForLastAddConfirmedUpdate(long ledgerId, Watcher<LastAddConfirmedUpdateNotification> watcher)
Cancel a previous wait for last add confirmed update.void
checkpoint(CheckpointSource.Checkpoint checkpoint)
Ask the ledger storage to sync data until the given checkpoint.void
clearLimboState(long ledgerId)
Clear the limbo state of a ledger.void
clearStorageStateFlag(LedgerStorage.StorageState flag)
Clear a storage state flag for the storage instance.void
deleteLedger(long ledgerId)
boolean
entryExists(long ledgerId, long entryId)
Whether an entry exists.void
entryLocationCompact()
void
entryLocationCompact(java.util.List<java.lang.String> locations)
void
flush()
Flushes all data in the storage.void
forceGC()
Force trigger Garbage Collection.void
forceGC(boolean forceMajor, boolean forceMinor)
Force trigger Garbage Collection with forceMajor or forceMinor parameter.java.lang.Iterable<java.lang.Long>
getActiveLedgersInRange(long firstLedgerId, long lastLedgerId)
(package private) static boolean
getBooleanVariableOrDefault(ServerConfiguration conf, java.lang.String keyName, boolean defaultValue)
io.netty.buffer.ByteBuf
getEntry(long ledgerId, long entryId)
Read an entry from storage.java.util.List<java.lang.String>
getEntryLocationDBPath()
io.netty.buffer.ByteBuf
getExplicitLac(long ledgerId)
java.util.List<GarbageCollectionStatus>
getGarbageCollectionStatus()
Get Garbage Collection status.long
getLastAddConfirmed(long ledgerId)
Get last add confirmed.io.netty.buffer.ByteBuf
getLastEntry(long ledgerId)
long
getLastEntryInLedger(long ledgerId)
(package private) java.util.List<SingleDirectoryDbLedgerStorage>
getLedgerStorageList()
java.util.PrimitiveIterator.OfLong
getListOfEntriesOfLedger(long ledgerId)
Returns the primitive long iterator for entries of the ledger, stored in this LedgerStorage.long
getLocation(long ledgerId, long entryId)
(package private) static long
getLongVariableOrDefault(ServerConfiguration conf, java.lang.String keyName, long defaultValue)
java.util.EnumSet<LedgerStorage.StorageState>
getStorageStateFlags()
Get the storage state flags currently set for the storage instance.boolean
hasLimboState(long ledgerId)
Check whether a ledger is in limbo state.void
initialize(ServerConfiguration conf, LedgerManager ledgerManager, LedgerDirsManager ledgerDirsManager, LedgerDirsManager indexDirsManager, StatsLogger statsLogger, io.netty.buffer.ByteBufAllocator allocator)
Initialize the LedgerStorage implementation.boolean
isEntryLocationCompacting()
java.util.Map<java.lang.String,java.lang.Boolean>
isEntryLocationCompacting(java.util.List<java.lang.String> locations)
boolean
isFenced(long ledgerId)
Check whether the ledger is fenced in ledger storage or not.(package private) boolean
isFlushRequired()
boolean
isInForceGC()
Whether force triggered Garbage Collection is running or not.boolean
isMajorGcSuspended()
boolean
isMinorGcSuspended()
boolean
ledgerExists(long ledgerId)
Whether a ledger exists.protected SingleDirectoryDbLedgerStorage
newSingleDirectoryDbLedgerStorage(ServerConfiguration conf, LedgerManager ledgerManager, LedgerDirsManager ledgerDirsManager, LedgerDirsManager indexDirsManager, EntryLogger entryLogger, StatsLogger statsLogger, long writeCacheSize, long readCacheSize, int readAheadCacheBatchSize, long readAheadCacheBatchBytesSize)
static void
readLedgerIndexEntries(long ledgerId, ServerConfiguration serverConf, SingleDirectoryDbLedgerStorage.LedgerLoggerProcessor processor)
Reads ledger index entries to get list of entry-logger that contains given ledgerId.byte[]
readMasterKey(long ledgerId)
Get the master key for a ledger.void
registerLedgerDeletionListener(LedgerStorage.LedgerDeletionListener listener)
Register a listener for ledgers deletion notifications.void
resumeMajorGC()
void
resumeMinorGC()
void
setCheckpointer(Checkpointer checkpointer)
void
setCheckpointSource(CheckpointSource checkpointSource)
void
setExplicitLac(long ledgerId, io.netty.buffer.ByteBuf lac)
boolean
setFenced(long ledgerId)
Fenced the ledger id in ledger storage.void
setLimboState(long ledgerId)
Set a ledger to limbo state.void
setMasterKey(long ledgerId, byte[] masterKey)
Set the master key for a ledger.void
setStateManager(StateManager stateManager)
void
setStorageStateFlag(LedgerStorage.StorageState flag)
Set a storage state flag for the storage instance.void
shutdown()
Cleanup and free any resources being used by the storage system.void
start()
Start any background threads belonging to the storage system.void
suspendMajorGC()
void
suspendMinorGC()
boolean
waitForLastAddConfirmedUpdate(long ledgerId, long previousLAC, Watcher<LastAddConfirmedUpdateNotification> watcher)
Wait for last add confirmed update.-
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.bookie.LedgerStorage
getUnderlyingLedgerStorage, localConsistencyCheck
-
-
-
-
Field Detail
-
WRITE_CACHE_MAX_SIZE_MB
public static final java.lang.String WRITE_CACHE_MAX_SIZE_MB
- See Also:
- Constant Field Values
-
READ_AHEAD_CACHE_MAX_SIZE_MB
public static final java.lang.String READ_AHEAD_CACHE_MAX_SIZE_MB
- See Also:
- Constant Field Values
-
DIRECT_IO_ENTRYLOGGER
public static final java.lang.String DIRECT_IO_ENTRYLOGGER
- See Also:
- Constant Field Values
-
DIRECT_IO_ENTRYLOGGER_TOTAL_WRITEBUFFER_SIZE_MB
public static final java.lang.String DIRECT_IO_ENTRYLOGGER_TOTAL_WRITEBUFFER_SIZE_MB
- See Also:
- Constant Field Values
-
DIRECT_IO_ENTRYLOGGER_TOTAL_READBUFFER_SIZE_MB
public static final java.lang.String DIRECT_IO_ENTRYLOGGER_TOTAL_READBUFFER_SIZE_MB
- See Also:
- Constant Field Values
-
DIRECT_IO_ENTRYLOGGER_READBUFFER_SIZE_MB
public static final java.lang.String DIRECT_IO_ENTRYLOGGER_READBUFFER_SIZE_MB
- See Also:
- Constant Field Values
-
DIRECT_IO_ENTRYLOGGER_MAX_FD_CACHE_TIME_SECONDS
public static final java.lang.String DIRECT_IO_ENTRYLOGGER_MAX_FD_CACHE_TIME_SECONDS
- See Also:
- Constant Field Values
-
MAX_THROTTLE_TIME_MILLIS
static final java.lang.String MAX_THROTTLE_TIME_MILLIS
- See Also:
- Constant Field Values
-
READ_AHEAD_CACHE_BATCH_SIZE
static final java.lang.String READ_AHEAD_CACHE_BATCH_SIZE
- See Also:
- Constant Field Values
-
READ_AHEAD_CACHE_BATCH_BYTES_SIZE
static final java.lang.String READ_AHEAD_CACHE_BATCH_BYTES_SIZE
- See Also:
- Constant Field Values
-
allocator
protected io.netty.buffer.ByteBufAllocator allocator
-
-
Method Detail
-
initialize
public void initialize(ServerConfiguration conf, LedgerManager ledgerManager, LedgerDirsManager ledgerDirsManager, LedgerDirsManager indexDirsManager, StatsLogger statsLogger, io.netty.buffer.ByteBufAllocator allocator) throws java.io.IOException
Description copied from interface:LedgerStorage
Initialize the LedgerStorage implementation.- Specified by:
initialize
in interfaceLedgerStorage
- Throws:
java.io.IOException
-
newSingleDirectoryDbLedgerStorage
protected SingleDirectoryDbLedgerStorage newSingleDirectoryDbLedgerStorage(ServerConfiguration conf, LedgerManager ledgerManager, LedgerDirsManager ledgerDirsManager, LedgerDirsManager indexDirsManager, EntryLogger entryLogger, StatsLogger statsLogger, long writeCacheSize, long readCacheSize, int readAheadCacheBatchSize, long readAheadCacheBatchBytesSize) throws java.io.IOException
- Throws:
java.io.IOException
-
setStateManager
public void setStateManager(StateManager stateManager)
- Specified by:
setStateManager
in interfaceLedgerStorage
-
setCheckpointSource
public void setCheckpointSource(CheckpointSource checkpointSource)
- Specified by:
setCheckpointSource
in interfaceLedgerStorage
-
setCheckpointer
public void setCheckpointer(Checkpointer checkpointer)
- Specified by:
setCheckpointer
in interfaceLedgerStorage
-
start
public void start()
Description copied from interface:LedgerStorage
Start any background threads belonging to the storage system. For example, garbage collection.- Specified by:
start
in interfaceLedgerStorage
-
shutdown
public void shutdown() throws java.lang.InterruptedException
Description copied from interface:LedgerStorage
Cleanup and free any resources being used by the storage system.- Specified by:
shutdown
in interfaceLedgerStorage
- Throws:
java.lang.InterruptedException
-
ledgerExists
public boolean ledgerExists(long ledgerId) throws java.io.IOException
Description copied from interface:LedgerStorage
Whether a ledger exists.- Specified by:
ledgerExists
in interfaceLedgerStorage
- Throws:
java.io.IOException
-
entryExists
public boolean entryExists(long ledgerId, long entryId) throws java.io.IOException, BookieException
Description copied from interface:LedgerStorage
Whether an entry exists.- Specified by:
entryExists
in interfaceLedgerStorage
- Throws:
java.io.IOException
BookieException
-
setFenced
public boolean setFenced(long ledgerId) throws java.io.IOException
Description copied from interface:LedgerStorage
Fenced the ledger id in ledger storage.- Specified by:
setFenced
in interfaceLedgerStorage
- Parameters:
ledgerId
- Ledger Id.- Throws:
java.io.IOException
- when failed to fence the ledger.
-
isFenced
public boolean isFenced(long ledgerId) throws java.io.IOException, BookieException
Description copied from interface:LedgerStorage
Check whether the ledger is fenced in ledger storage or not.- Specified by:
isFenced
in interfaceLedgerStorage
- Parameters:
ledgerId
- Ledger ID.- Throws:
java.io.IOException
BookieException
-
setMasterKey
public void setMasterKey(long ledgerId, byte[] masterKey) throws java.io.IOException
Description copied from interface:LedgerStorage
Set the master key for a ledger.- Specified by:
setMasterKey
in interfaceLedgerStorage
- Throws:
java.io.IOException
-
readMasterKey
public byte[] readMasterKey(long ledgerId) throws java.io.IOException, BookieException
Description copied from interface:LedgerStorage
Get the master key for a ledger.- Specified by:
readMasterKey
in interfaceLedgerStorage
- Throws:
java.io.IOException
- if there is an error reading the from the ledgerBookieException
- if no such ledger exists
-
addEntry
public long addEntry(io.netty.buffer.ByteBuf entry) throws java.io.IOException, BookieException
Description copied from interface:LedgerStorage
Add an entry to the storage.- Specified by:
addEntry
in interfaceLedgerStorage
- Returns:
- the entry id of the entry added
- Throws:
java.io.IOException
BookieException
-
getEntry
public io.netty.buffer.ByteBuf getEntry(long ledgerId, long entryId) throws java.io.IOException, BookieException
Description copied from interface:LedgerStorage
Read an entry from storage.- Specified by:
getEntry
in interfaceLedgerStorage
- Throws:
java.io.IOException
BookieException
-
getLastAddConfirmed
public long getLastAddConfirmed(long ledgerId) throws java.io.IOException, BookieException
Description copied from interface:LedgerStorage
Get last add confirmed.- Specified by:
getLastAddConfirmed
in interfaceLedgerStorage
- Parameters:
ledgerId
- ledger id.- Returns:
- last add confirmed.
- Throws:
java.io.IOException
BookieException
-
waitForLastAddConfirmedUpdate
public boolean waitForLastAddConfirmedUpdate(long ledgerId, long previousLAC, Watcher<LastAddConfirmedUpdateNotification> watcher) throws java.io.IOException
Description copied from interface:LedgerStorage
Wait for last add confirmed update.- Specified by:
waitForLastAddConfirmedUpdate
in interfaceLedgerStorage
previousLAC
- - The threshold beyond which we would wait for the updatewatcher
- - Watcher to notify on update- Returns:
- Throws:
java.io.IOException
-
cancelWaitForLastAddConfirmedUpdate
public void cancelWaitForLastAddConfirmedUpdate(long ledgerId, Watcher<LastAddConfirmedUpdateNotification> watcher) throws java.io.IOException
Description copied from interface:LedgerStorage
Cancel a previous wait for last add confirmed update.- Specified by:
cancelWaitForLastAddConfirmedUpdate
in interfaceLedgerStorage
- Parameters:
ledgerId
- The ledger being watched.watcher
- The watcher to cancel.- Throws:
java.io.IOException
-
flush
public void flush() throws java.io.IOException
Description copied from interface:LedgerStorage
Flushes all data in the storage. Once this is called, add data written to the LedgerStorage up until this point has been persisted to perminant storage- Specified by:
flush
in interfaceLedgerStorage
- Throws:
java.io.IOException
-
checkpoint
public void checkpoint(CheckpointSource.Checkpoint checkpoint) throws java.io.IOException
Description copied from interface:LedgerStorage
Ask the ledger storage to sync data until the given checkpoint. The ledger storage implementation do checkpoint and return the real checkpoint that it finished. The returned the checkpoint indicates that all entries added before that point already persist.- Specified by:
checkpoint
in interfaceLedgerStorage
- Parameters:
checkpoint
- Check Point thatCheckpointSource.Checkpoint
proposed.- Throws:
java.io.IOException
-
deleteLedger
public void deleteLedger(long ledgerId) throws java.io.IOException
- Specified by:
deleteLedger
in interfaceLedgerStorage
- Throws:
java.io.IOException
-
registerLedgerDeletionListener
public void registerLedgerDeletionListener(LedgerStorage.LedgerDeletionListener listener)
Description copied from interface:LedgerStorage
Register a listener for ledgers deletion notifications.- Specified by:
registerLedgerDeletionListener
in interfaceLedgerStorage
- Parameters:
listener
- object that will be notified every time a ledger is deleted
-
setExplicitLac
public void setExplicitLac(long ledgerId, io.netty.buffer.ByteBuf lac) throws java.io.IOException
- Specified by:
setExplicitLac
in interfaceLedgerStorage
- Throws:
java.io.IOException
-
getExplicitLac
public io.netty.buffer.ByteBuf getExplicitLac(long ledgerId) throws java.io.IOException, BookieException
- Specified by:
getExplicitLac
in interfaceLedgerStorage
- Throws:
java.io.IOException
BookieException
-
addLedgerToIndex
public long addLedgerToIndex(long ledgerId, boolean isFenced, byte[] masterKey, LedgerCache.PageEntriesIterable pages) throws java.lang.Exception
- Throws:
java.lang.Exception
-
getLastEntryInLedger
public long getLastEntryInLedger(long ledgerId) throws java.io.IOException
- Throws:
java.io.IOException
-
getLocation
public long getLocation(long ledgerId, long entryId) throws java.io.IOException
- Throws:
java.io.IOException
-
getActiveLedgersInRange
public java.lang.Iterable<java.lang.Long> getActiveLedgersInRange(long firstLedgerId, long lastLedgerId) throws java.io.IOException
- Throws:
java.io.IOException
-
getLastEntry
public io.netty.buffer.ByteBuf getLastEntry(long ledgerId) throws java.io.IOException, BookieException
- Throws:
java.io.IOException
BookieException
-
isFlushRequired
boolean isFlushRequired()
-
getLedgerStorageList
java.util.List<SingleDirectoryDbLedgerStorage> getLedgerStorageList()
-
readLedgerIndexEntries
public static void readLedgerIndexEntries(long ledgerId, ServerConfiguration serverConf, SingleDirectoryDbLedgerStorage.LedgerLoggerProcessor processor) throws java.io.IOException
Reads ledger index entries to get list of entry-logger that contains given ledgerId.- Parameters:
ledgerId
-serverConf
-processor
-- Throws:
java.io.IOException
-
forceGC
public void forceGC()
Description copied from interface:LedgerStorage
Force trigger Garbage Collection.- Specified by:
forceGC
in interfaceLedgerStorage
-
forceGC
public void forceGC(boolean forceMajor, boolean forceMinor)
Description copied from interface:LedgerStorage
Force trigger Garbage Collection with forceMajor or forceMinor parameter.- Specified by:
forceGC
in interfaceLedgerStorage
-
isInForceGC
public boolean isInForceGC()
Description copied from interface:LedgerStorage
Whether force triggered Garbage Collection is running or not.- Specified by:
isInForceGC
in interfaceLedgerStorage
- Returns:
- true -- force triggered Garbage Collection is running, false -- force triggered Garbage Collection is not running
-
suspendMinorGC
public void suspendMinorGC()
- Specified by:
suspendMinorGC
in interfaceLedgerStorage
-
suspendMajorGC
public void suspendMajorGC()
- Specified by:
suspendMajorGC
in interfaceLedgerStorage
-
resumeMinorGC
public void resumeMinorGC()
- Specified by:
resumeMinorGC
in interfaceLedgerStorage
-
resumeMajorGC
public void resumeMajorGC()
- Specified by:
resumeMajorGC
in interfaceLedgerStorage
-
isMajorGcSuspended
public boolean isMajorGcSuspended()
- Specified by:
isMajorGcSuspended
in interfaceLedgerStorage
-
isMinorGcSuspended
public boolean isMinorGcSuspended()
- Specified by:
isMinorGcSuspended
in interfaceLedgerStorage
-
entryLocationCompact
public void entryLocationCompact()
- Specified by:
entryLocationCompact
in interfaceLedgerStorage
-
entryLocationCompact
public void entryLocationCompact(java.util.List<java.lang.String> locations)
- Specified by:
entryLocationCompact
in interfaceLedgerStorage
-
isEntryLocationCompacting
public boolean isEntryLocationCompacting()
- Specified by:
isEntryLocationCompacting
in interfaceLedgerStorage
-
isEntryLocationCompacting
public java.util.Map<java.lang.String,java.lang.Boolean> isEntryLocationCompacting(java.util.List<java.lang.String> locations)
- Specified by:
isEntryLocationCompacting
in interfaceLedgerStorage
-
getEntryLocationDBPath
public java.util.List<java.lang.String> getEntryLocationDBPath()
- Specified by:
getEntryLocationDBPath
in interfaceLedgerStorage
-
getGarbageCollectionStatus
public java.util.List<GarbageCollectionStatus> getGarbageCollectionStatus()
Description copied from interface:LedgerStorage
Get Garbage Collection status. Since DbLedgerStorage is a list of storage instances, we should return a list.- Specified by:
getGarbageCollectionStatus
in interfaceLedgerStorage
-
getLongVariableOrDefault
static long getLongVariableOrDefault(ServerConfiguration conf, java.lang.String keyName, long defaultValue)
-
getBooleanVariableOrDefault
static boolean getBooleanVariableOrDefault(ServerConfiguration conf, java.lang.String keyName, boolean defaultValue)
-
getListOfEntriesOfLedger
public java.util.PrimitiveIterator.OfLong getListOfEntriesOfLedger(long ledgerId) throws java.io.IOException
Description copied from interface:LedgerStorage
Returns the primitive long iterator for entries of the ledger, stored in this LedgerStorage. The returned iterator provide weakly consistent state of the ledger. It is guaranteed that entries of the ledger added to this LedgerStorage by the time this method is called will be available but modifications made after method invocation may not be available.- Specified by:
getListOfEntriesOfLedger
in interfaceLedgerStorage
- Parameters:
ledgerId
- - id of the ledger- Returns:
- the list of entries of the ledger available in this ledgerstorage.
- Throws:
java.io.IOException
-
setLimboState
public void setLimboState(long ledgerId) throws java.io.IOException
Description copied from interface:LedgerStorage
Set a ledger to limbo state. When a ledger is in limbo state, we cannot answer any requests about it. For example, if a client asks for an entry, we cannot say we don't have it because it may have been written to us in the past, but we are waiting for data integrity checks to copy it over.- Specified by:
setLimboState
in interfaceLedgerStorage
- Throws:
java.io.IOException
-
hasLimboState
public boolean hasLimboState(long ledgerId) throws java.io.IOException
Description copied from interface:LedgerStorage
Check whether a ledger is in limbo state.- Specified by:
hasLimboState
in interfaceLedgerStorage
- Throws:
java.io.IOException
- See Also:
LedgerStorage.setLimboState(long)
-
clearLimboState
public void clearLimboState(long ledgerId) throws java.io.IOException
Description copied from interface:LedgerStorage
Clear the limbo state of a ledger.- Specified by:
clearLimboState
in interfaceLedgerStorage
- Throws:
java.io.IOException
- See Also:
LedgerStorage.setLimboState(long)
-
getStorageStateFlags
public java.util.EnumSet<LedgerStorage.StorageState> getStorageStateFlags() throws java.io.IOException
Description copied from interface:LedgerStorage
Get the storage state flags currently set for the storage instance.- Specified by:
getStorageStateFlags
in interfaceLedgerStorage
- Throws:
java.io.IOException
-
setStorageStateFlag
public void setStorageStateFlag(LedgerStorage.StorageState flag) throws java.io.IOException
Description copied from interface:LedgerStorage
Set a storage state flag for the storage instance. Implementations must ensure this method is atomic, and the flag is persisted to storage when the method returns.- Specified by:
setStorageStateFlag
in interfaceLedgerStorage
- Throws:
java.io.IOException
-
clearStorageStateFlag
public void clearStorageStateFlag(LedgerStorage.StorageState flag) throws java.io.IOException
Description copied from interface:LedgerStorage
Clear a storage state flag for the storage instance. Implementations must ensure this method is atomic, and the flag is persisted to storage when the method returns.- Specified by:
clearStorageStateFlag
in interfaceLedgerStorage
- Throws:
java.io.IOException
-
-