Class AbstractFSWAL<W extends WALProvider.WriterBase>
- All Implemented Interfaces:
Closeable,AutoCloseable,WALFileLengthProvider,WAL
- Direct Known Subclasses:
AsyncFSWAL,FSHLog
WAL to go against FileSystem; i.e. keep WALs in HDFS. Only one
WAL is ever being written at a time. When a WAL hits a configured maximum size, it is rolled.
This is done internal to the implementation.
As data is flushed from the MemStore to other on-disk structures (files sorted by key, hfiles), a WAL becomes obsolete. We can let go of all the log edits/entries for a given HRegion-sequence id. A bunch of work in the below is done keeping account of these region sequence ids -- what is flushed out to hfiles, and what is yet in WAL and in memory only.
It is only practical to delete entire files. Thus, we delete an entire on-disk file
F when all of the edits in F have a log-sequence-id that's older
(smaller) than the most-recent flush.
To read an WAL, call WALFactory.createStreamReader(FileSystem, Path) for one way read,
call WALFactory.createTailingReader(FileSystem, Path, Configuration, long) for
replication where we may want to tail the active WAL file.
Failure Semantic
If an exception on append or sync, roll the WAL because the current WAL is now a lame duck; any more appends or syncs will fail also with the same original exception. If we have made successful appends to the WAL and we then are unable to sync them, our current semantic is to return error to the client that the appends failed but also to abort the current context, usually the hosting server. We need to replay the WALs.TODO: Change this semantic. A roll of WAL may be sufficient as long as we have flagged client that the append failed.
TODO: replication may pick up these last edits though they have been marked as failed append (Need to keep our own file lengths, not rely on HDFS).
-
Nested Class Summary
Nested Classes -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected final Abortableprivate final intprotected final longBlock size to use writing files.protected booleanprotected final ExecutorServiceprotected final org.apache.hadoop.conf.Configurationconf objectprotected final WALCoprocessorHostprotected static final intprotected static final intprotected static final intprotected static final intstatic final intprotected static final intprotected final AtomicLongprotected final org.apache.hadoop.fs.FileSystemfile system instanceprotected final AtomicLongUpdated to the transaction id of the last successful sync call.protected longThe highest known outstanding unsync'd WALEdit transaction id.protected final StringThe class name of the runtime implementation, used as prefix for logging/tracing.Tracks the logs in the process of being closed.private longprivate longprotected final List<WALActionsListener>Listeners that are called on WAL events.private static final org.slf4j.Logger(package private) final Comparator<org.apache.hadoop.fs.Path>WAL Comparator; it compares the timestamp (log filenum), present in the log file name.private final ExecutorServiceprotected final longstatic final Stringprotected final intprotected final AtomicIntegerprotected final org.apache.hadoop.fs.PathFilterMatches just those wal files that belong to this wal instance.protected final StringPrefix used when checking for wal membership.static final Stringprotected static final Stringprotected final longprotected final AtomicBooleanprotected final ReentrantLockThis lock makes sure only one log roll runs at a time.protected final SequenceIdAccountingClass that does accounting of sequenceids in WAL subsystem.protected final AtomicBooleanprotected static final Stringprotected static final Stringprotected static final Stringprotected final intprotected final AtomicIntegerprotected final longprotected final intprotected final SyncFutureCacheA cache of sync futures reused by threads.protected final AtomicLongThe total size of walprotected final booleanstatic final booleanstatic final Stringstatic final Stringstatic final Stringstatic final Stringprotected final org.apache.hadoop.fs.Pathdir path where old logs are kept.protected final org.apache.hadoop.fs.PathWAL directory, where all WAL files would be placed.protected final ConcurrentNavigableMap<org.apache.hadoop.fs.Path,AbstractFSWAL.WALProps> Map of WAL log file to properties.protected final StringPrefix of a WAL file, usually the region server name it is hosted on.protected final StringSuffix included on generated wal file namesprotected final longprivate final long(package private) WCurrent log file. -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotectedAbstractFSWAL(org.apache.hadoop.fs.FileSystem fs, org.apache.hadoop.fs.Path rootDir, String logDir, String archiveDir, org.apache.hadoop.conf.Configuration conf, List<WALActionsListener> listeners, boolean failIfWALExists, String prefix, String suffix) protectedAbstractFSWAL(org.apache.hadoop.fs.FileSystem fs, Abortable abortable, org.apache.hadoop.fs.Path rootDir, String logDir, String archiveDir, org.apache.hadoop.conf.Configuration conf, List<WALActionsListener> listeners, boolean failIfWALExists, String prefix, String suffix) -
Method Summary
Modifier and TypeMethodDescriptionvoidabortCacheFlush(byte[] encodedRegionName) Abort a cache flush.protected abstract longappend(RegionInfo info, WALKeyImpl key, WALEdit edits, boolean inMemstore) Append a set of edits to the WAL.longappendData(RegionInfo info, WALKeyImpl key, WALEdit edits) Append a set of data edits to the WAL.protected final booleanappendEntry(W writer, FSWALEntry entry) longappendMarker(RegionInfo info, WALKeyImpl key, WALEdit edits) Append an operational 'meta' event marker edit to the WAL.protected voidprotected voidarchiveLogFile(org.apache.hadoop.fs.Path p) protected voidExposed for testing only.protected final voidblockOnSync(SyncFuture syncFuture) private intcalculateMaxLogFiles(org.apache.hadoop.conf.Configuration conf, long logRollSize) voidcheckLogLowReplication(long checkInterval) private voidArchive old logs.voidclose()Caller no longer needs any edits from this WAL.voidcompleteCacheFlush(byte[] encodedRegionName, long maxFlushedSeqId) Complete the cache flush.protected org.apache.hadoop.fs.PathcomputeFilename(long filenum) This is a convenience method that computes a new filename with a given file-number.private IOExceptionprivate io.opentelemetry.api.trace.SpancreateSpan(String name) protected abstract WcreateWriterInstance(org.apache.hadoop.fs.Path path) protected abstract voiddoAppend(W writer, FSWALEntry entry) protected abstract booleanprotected booleanReturns true if we exceeded the slow sync roll threshold over the last check intervalprotected abstract voiddoReplaceWriter(org.apache.hadoop.fs.Path oldPath, org.apache.hadoop.fs.Path newPath, W nextWriter) Notice that you need to clear therollRequestedflag in this method, as the new writer will begin to work before returning from this method.protected abstract voidprotected abstract voiddoSync(boolean forceSync) protected abstract voiddoSync(long txid, boolean forceSync) private static IOExceptionIf the number of un-archived WAL files ('live' WALs) is greater than maximum allowed, check the first (oldest) WAL, and return those regions which should be flushed so that it can be let-go/'archived'.Returns Coprocessor host.org.apache.hadoop.fs.PathThis is a convenience method that computes a new filename with a given using the current WAL file-numberlonggetEarliestMemStoreSeqNum(byte[] encodedRegionName) Gets the earliest unflushed sequence id in the memstore for the region.longgetEarliestMemStoreSeqNum(byte[] encodedRegionName, byte[] familyName) Gets the earliest unflushed sequence id in the memstore for the store.longprotected longgetFileNumFromFileName(org.apache.hadoop.fs.Path fileName) A log file has a creation timestamp (in ms) in its file name (filenum.(package private) org.apache.hadoop.fs.FileStatus[]getFiles()Get the backing files associated with this WAL.intReturns number of WALs currently in the process of closing.longReturns the size of log files in usegetLogFileSizeIfBeingWritten(org.apache.hadoop.fs.Path path) if the givenpathis being written currently, then return its length.(package private) abstract intThis method gets the datanode replication count for the current WAL.private org.apache.hadoop.fs.Pathretrieve the next path to use for writing.intReturns the number of log files in useintReturns the number of rolled log filesorg.apache.hadoop.fs.Path(package private) abstract org.apache.hadoop.hdfs.protocol.DatanodeInfo[]This method gets the pipeline for the current WAL.protected final intprotected final SyncFuturegetSyncFuture(long sequence, boolean forceSync) (package private) longstatic org.apache.hadoop.fs.PathgetWALArchivePath(org.apache.hadoop.fs.Path archiveDir, org.apache.hadoop.fs.Path p) (package private) Wvoidinit()Used to initialize the WAL.protected boolean(package private) booleanprotected final voidlogRollAndSetupWalProps(org.apache.hadoop.fs.Path oldPath, org.apache.hadoop.fs.Path newPath, long oldFileLen) static voidPass one or more log file names, and it will either dump out a text version onstdoutor split the specified log files.protected final voidmarkClosedAndClean(org.apache.hadoop.fs.Path path) Mark this WAL file as closed and call cleanOldLogs to see if we can archive this file.private longpostAppend(WAL.Entry e, long elapsedTime) protected final voidpostSync(long timeInNanos, int handlerSyncs) voidregisterWALActionsListener(WALActionsListener listener) Registers WALActionsListener(package private) org.apache.hadoop.fs.PathreplaceWriter(org.apache.hadoop.fs.Path oldPath, org.apache.hadoop.fs.Path newPath, W nextWriter) Cleans up current writer closing it and then puts in place the passed innextWriter.voidprotected final voidRoll the log writer.rollWriter(boolean force) Roll the log writer.rollWriterInternal(boolean force) voidshutdown()Stop accepting new writes.private static voidsplit(org.apache.hadoop.conf.Configuration conf, org.apache.hadoop.fs.Path p) protected final longstampSequenceIdAndPublishToRingBuffer(RegionInfo hri, WALKeyImpl key, WALEdit edits, boolean inMemstore, com.lmax.disruptor.RingBuffer<RingBufferTruck> ringBuffer) startCacheFlush(byte[] encodedRegionName, Map<byte[], Long> familyToSeq) startCacheFlush(byte[] encodedRegionName, Set<byte[]> families) WAL keeps track of the sequence numbers that are as yet not flushed im memstores in order to be able to do accounting to figure which WALs can be let go.final voidsync()Sync what we have in the WAL.final voidsync(boolean forceSync) final voidsync(long txid) Sync the WAL if the txId was not already sync'd.final voidsync(long txid, boolean forceSync) private voidtellListenersAboutPostLogRoll(org.apache.hadoop.fs.Path oldPath, org.apache.hadoop.fs.Path newPath) Tell listeners about post log roll.private voidtellListenersAboutPreLogRoll(org.apache.hadoop.fs.Path oldPath, org.apache.hadoop.fs.Path newPath) Tell listeners about pre log roll.toString()Human readable identifying information about the state of this WAL.booleanUnregisters WALActionsListenervoidupdateStore(byte[] encodedRegionName, byte[] familyName, Long sequenceid, boolean onlyIfGreater) updates the sequence number of a specific store.private static voidusage()
-
Field Details
-
LOG
-
SLOW_SYNC_TIME_MS
- See Also:
-
DEFAULT_SLOW_SYNC_TIME_MS
- See Also:
-
ROLL_ON_SYNC_TIME_MS
- See Also:
-
DEFAULT_ROLL_ON_SYNC_TIME_MS
- See Also:
-
SLOW_SYNC_ROLL_THRESHOLD
- See Also:
-
DEFAULT_SLOW_SYNC_ROLL_THRESHOLD
- See Also:
-
SLOW_SYNC_ROLL_INTERVAL_MS
- See Also:
-
DEFAULT_SLOW_SYNC_ROLL_INTERVAL_MS
- See Also:
-
WAL_SYNC_TIMEOUT_MS
- See Also:
-
DEFAULT_WAL_SYNC_TIMEOUT_MS
- See Also:
-
WAL_ROLL_MULTIPLIER
- See Also:
-
MAX_LOGS
- See Also:
-
RING_BUFFER_SLOT_COUNT
- See Also:
-
WAL_SHUTDOWN_WAIT_TIMEOUT_MS
- See Also:
-
DEFAULT_WAL_SHUTDOWN_WAIT_TIMEOUT_MS
- See Also:
-
WAL_AVOID_LOCAL_WRITES_KEY
- See Also:
-
WAL_AVOID_LOCAL_WRITES_DEFAULT
- See Also:
-
fs
file system instance -
walDir
WAL directory, where all WAL files would be placed. -
walArchiveDir
dir path where old logs are kept. -
ourFiles
Matches just those wal files that belong to this wal instance. -
walFilePrefix
Prefix of a WAL file, usually the region server name it is hosted on. -
walFileSuffix
Suffix included on generated wal file names -
prefixPathStr
Prefix used when checking for wal membership. -
coprocessorHost
-
conf
conf object -
abortable
-
listeners
Listeners that are called on WAL events. -
inflightWALClosures
Tracks the logs in the process of being closed. -
sequenceIdAccounting
Class that does accounting of sequenceids in WAL subsystem. Holds oldest outstanding sequence id as yet not flushed as well as the most recent edit sequence id appended to the WAL. Has facility for answering questions such as "Is it safe to GC a WAL?". -
slowSyncNs
-
rollOnSyncNs
-
slowSyncRollThreshold
-
slowSyncCheckInterval
-
slowSyncCount
-
walSyncTimeoutNs
-
logrollsize
-
blocksize
Block size to use writing files. -
maxLogs
-
useHsync
-
rollWriterLock
This lock makes sure only one log roll runs at a time. Should not be taken while any other lock is held. We don't just use synchronized because that results in bogus and tedious findbugs warning when it thinks synchronized controls writer thread safety. It is held when we are actually rolling the log. It is checked when we are looking to see if we should roll the log or not. -
filenum
-
numEntries
-
highestUnsyncedTxid
The highest known outstanding unsync'd WALEdit transaction id. Usually, we use a queue to pass WALEdit to background consumer thread, and the transaction id is the sequence number of the corresponding entry in queue. -
highestSyncedTxid
Updated to the transaction id of the last successful sync call. This can be less thanhighestUnsyncedTxidfor case where we have an append where a sync has not yet come in for it. -
totalLogSize
The total size of wal -
writer
Current log file. -
lastTimeCheckLowReplication
-
lastTimeCheckSlowSync
-
closed
-
shutdown
-
walShutdownTimeout
-
LOG_NAME_COMPARATOR
WAL Comparator; it compares the timestamp (log filenum), present in the log file name. Throws an IllegalArgumentException if used to compare paths from different wals. -
walFile2Props
protected final ConcurrentNavigableMap<org.apache.hadoop.fs.Path,AbstractFSWAL.WALProps> walFile2PropsMap of WAL log file to properties. The map is sorted by the log file creation timestamp (contained in the log file name). -
syncFutureCache
A cache of sync futures reused by threads. -
implClassName
The class name of the runtime implementation, used as prefix for logging/tracing.Performance testing shows getClass().getSimpleName() might be a bottleneck so we store it here, refer to HBASE-17676 for more details
-
rollRequested
-
closeExecutor
-
logArchiveExecutor
-
archiveRetries
-
-
Constructor Details
-
AbstractFSWAL
protected AbstractFSWAL(org.apache.hadoop.fs.FileSystem fs, org.apache.hadoop.fs.Path rootDir, String logDir, String archiveDir, org.apache.hadoop.conf.Configuration conf, List<WALActionsListener> listeners, boolean failIfWALExists, String prefix, String suffix) throws FailedLogCloseException, IOException - Throws:
FailedLogCloseExceptionIOException
-
AbstractFSWAL
protected AbstractFSWAL(org.apache.hadoop.fs.FileSystem fs, Abortable abortable, org.apache.hadoop.fs.Path rootDir, String logDir, String archiveDir, org.apache.hadoop.conf.Configuration conf, List<WALActionsListener> listeners, boolean failIfWALExists, String prefix, String suffix) throws FailedLogCloseException, IOException - Throws:
FailedLogCloseExceptionIOException
-
-
Method Details
-
getFilenum
-
getFileNumFromFileName
A log file has a creation timestamp (in ms) in its file name (filenum. This helper method returns the creation timestamp from a given log file. It extracts the timestamp assuming the filename is created with thecomputeFilename(long filenum)method.- Returns:
- timestamp, as in the log file name.
-
calculateMaxLogFiles
-
getPreallocatedEventCount
-
init
Used to initialize the WAL. Usually just call rollWriter to create the first log writer.- Throws:
IOException
-
registerWALActionsListener
Description copied from interface:WALRegisters WALActionsListener- Specified by:
registerWALActionsListenerin interfaceWAL
-
unregisterWALActionsListener
Description copied from interface:WALUnregisters WALActionsListener- Specified by:
unregisterWALActionsListenerin interfaceWAL
-
getCoprocessorHost
Description copied from interface:WALReturns Coprocessor host.- Specified by:
getCoprocessorHostin interfaceWAL
-
startCacheFlush
Description copied from interface:WALWAL keeps track of the sequence numbers that are as yet not flushed im memstores in order to be able to do accounting to figure which WALs can be let go. This method tells WAL that some region is about to flush. The flush can be the whole region or for a column family of the region only.Currently, it is expected that the update lock is held for the region; i.e. no concurrent appends while we set up cache flush.
- Specified by:
startCacheFlushin interfaceWALfamilies- Families to flush. May be a subset of all families in the region.- Returns:
- Returns
HConstants.NO_SEQNUMif we are flushing the whole region OR if we are flushing a subset of all families but there are no edits in those families not being flushed; in other words, this is effectively same as a flush of all of the region though we were passed a subset of regions. Otherwise, it returns the sequence id of the oldest/lowest outstanding edit. - See Also:
-
startCacheFlush
- Specified by:
startCacheFlushin interfaceWAL
-
completeCacheFlush
Description copied from interface:WALComplete the cache flush.- Specified by:
completeCacheFlushin interfaceWAL- Parameters:
encodedRegionName- Encoded region name.maxFlushedSeqId- The maxFlushedSeqId for this flush. There is no edit in memory that is less that this sequence id.- See Also:
-
abortCacheFlush
Description copied from interface:WALAbort a cache flush. Call if the flush fails. Note that the only recovery for an aborted flush currently is a restart of the regionserver so the snapshot content dropped by the failure gets restored to the memstore.- Specified by:
abortCacheFlushin interfaceWAL- Parameters:
encodedRegionName- Encoded region name.
-
getEarliestMemStoreSeqNum
Description copied from interface:WALGets the earliest unflushed sequence id in the memstore for the region.- Specified by:
getEarliestMemStoreSeqNumin interfaceWAL- Parameters:
encodedRegionName- The region to get the number for.- Returns:
- The earliest/lowest/oldest sequence id if present, HConstants.NO_SEQNUM if absent.
-
getEarliestMemStoreSeqNum
Description copied from interface:WALGets the earliest unflushed sequence id in the memstore for the store.- Specified by:
getEarliestMemStoreSeqNumin interfaceWAL- Parameters:
encodedRegionName- The region to get the number for.familyName- The family to get the number for.- Returns:
- The earliest/lowest/oldest sequence id if present, HConstants.NO_SEQNUM if absent.
-
rollWriter
Description copied from interface:WALRoll the log writer. That is, start writing log messages to a new file. The implementation is synchronized in order to make sure there's one rollWriter running at any given time.- Specified by:
rollWriterin interfaceWAL- Returns:
- If lots of logs, flush the stores of returned regions so next time through we can clean
logs. Returns null if nothing to flush. Names are actual region names as returned by
RegionInfo.getEncodedName() - Throws:
FailedLogCloseExceptionIOException
-
sync
Description copied from interface:WALSync what we have in the WAL.- Specified by:
syncin interfaceWAL- Throws:
IOException
-
sync
Description copied from interface:WALSync the WAL if the txId was not already sync'd.- Specified by:
syncin interfaceWAL- Parameters:
txid- Transaction id to sync to.- Throws:
IOException
-
sync
- Specified by:
syncin interfaceWAL- Parameters:
forceSync- Flag to force sync rather than flushing to the buffer. Example - Hadoop hflush vs hsync.- Throws:
IOException
-
sync
- Specified by:
syncin interfaceWAL- Parameters:
txid- Transaction id to sync to.forceSync- Flag to force sync rather than flushing to the buffer. Example - Hadoop hflush vs hsync.- Throws:
IOException
-
doSync
- Throws:
IOException
-
doSync
- Throws:
IOException
-
computeFilename
This is a convenience method that computes a new filename with a given file-number.- Parameters:
filenum- to use
-
getCurrentFileName
This is a convenience method that computes a new filename with a given using the current WAL file-number -
getNewPath
retrieve the next path to use for writing. Increments the internal filenum.- Throws:
IOException
-
getOldPath
-
tellListenersAboutPreLogRoll
private void tellListenersAboutPreLogRoll(org.apache.hadoop.fs.Path oldPath, org.apache.hadoop.fs.Path newPath) throws IOException Tell listeners about pre log roll.- Throws:
IOException
-
tellListenersAboutPostLogRoll
private void tellListenersAboutPostLogRoll(org.apache.hadoop.fs.Path oldPath, org.apache.hadoop.fs.Path newPath) throws IOException Tell listeners about post log roll.- Throws:
IOException
-
getNumRolledLogFiles
Returns the number of rolled log files -
getNumLogFiles
Returns the number of log files in use -
findRegionsToForceFlush
If the number of un-archived WAL files ('live' WALs) is greater than maximum allowed, check the first (oldest) WAL, and return those regions which should be flushed so that it can be let-go/'archived'.- Returns:
- stores of regions (encodedRegionNames) to flush in order to archive the oldest WAL file
- Throws:
IOException
-
markClosedAndClean
Mark this WAL file as closed and call cleanOldLogs to see if we can archive this file. -
cleanOldLogs
Archive old logs. A WAL is eligible for archiving if all its WALEdits have been flushed. Use synchronized because we may call this method in different threads, normally when replacing writer, and since now close writer may be asynchronous, we will also call this method in the closeExecutor, right after we actually close a WAL writer. -
archive
-
getWALArchivePath
public static org.apache.hadoop.fs.Path getWALArchivePath(org.apache.hadoop.fs.Path archiveDir, org.apache.hadoop.fs.Path p) -
archiveLogFile
- Throws:
IOException
-
logRollAndSetupWalProps
protected final void logRollAndSetupWalProps(org.apache.hadoop.fs.Path oldPath, org.apache.hadoop.fs.Path newPath, long oldFileLen) -
createSpan
-
replaceWriter
org.apache.hadoop.fs.Path replaceWriter(org.apache.hadoop.fs.Path oldPath, org.apache.hadoop.fs.Path newPath, W nextWriter) throws IOException Cleans up current writer closing it and then puts in place the passed innextWriter.- In the case of creating a new WAL, oldPath will be null.
- In the case of rolling over from one file to the next, none of the parameters will be null.
- In the case of closing out this FSHLog with no further use newPath and nextWriter will be null.
- Parameters:
oldPath- may be nullnewPath- may be nullnextWriter- may be null- Returns:
- the passed in
newPath - Throws:
IOException- if there is a problem flushing or closing the underlying FS
-
blockOnSync
- Throws:
IOException
-
ensureIOException
-
convertInterruptedExceptionToIOException
-
rollWriterInternal
- Throws:
IOException
-
rollWriter
Description copied from interface:WALRoll the log writer. That is, start writing log messages to a new file. The implementation is synchronized in order to make sure there's one rollWriter running at any given time. If true, force creation of a new writer even if no entries have been written to the current writer- Specified by:
rollWriterin interfaceWAL- Returns:
- If lots of logs, flush the stores of returned regions so next time through we can clean
logs. Returns null if nothing to flush. Names are actual region names as returned by
RegionInfo.getEncodedName() - Throws:
IOException
-
getLogFileSize
Returns the size of log files in use -
requestLogRoll
-
getFiles
Get the backing files associated with this WAL.- Returns:
- may be null if there are no files.
- Throws:
IOException
-
shutdown
Description copied from interface:WALStop accepting new writes. If we have unsynced writes still in buffer, sync them. Extant edits are left in place in backing storage to be replayed later.- Specified by:
shutdownin interfaceWAL- Throws:
IOException
-
close
Description copied from interface:WALCaller no longer needs any edits from this WAL. Implementers are free to reclaim underlying resources after this call; i.e. filesystem based WALs can archive or delete files.- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable- Specified by:
closein interfaceWAL- Throws:
IOException
-
getInflightWALCloseCount
Returns number of WALs currently in the process of closing. -
updateStore
public void updateStore(byte[] encodedRegionName, byte[] familyName, Long sequenceid, boolean onlyIfGreater) updates the sequence number of a specific store. depending on the flag: replaces current seq number if the given seq id is bigger, or even if it is lower than existing one- Specified by:
updateStorein interfaceWAL
-
getSyncFuture
-
isLogRollRequested
-
requestLogRoll
-
getUnflushedEntriesCount
long getUnflushedEntriesCount() -
isUnflushedEntries
boolean isUnflushedEntries() -
atHeadOfRingBufferEventHandlerAppend
Exposed for testing only. Use to tricks like halt the ring buffer appending. -
appendEntry
- Throws:
IOException
-
postAppend
- Throws:
IOException
-
postSync
-
stampSequenceIdAndPublishToRingBuffer
protected final long stampSequenceIdAndPublishToRingBuffer(RegionInfo hri, WALKeyImpl key, WALEdit edits, boolean inMemstore, com.lmax.disruptor.RingBuffer<RingBufferTruck> ringBuffer) throws IOException - Throws:
IOException
-
toString
Description copied from interface:WALHuman readable identifying information about the state of this WAL. Implementors are encouraged to include information appropriate for debugging. Consumers are advised not to rely on the details of the returned String; it does not have a defined structure. -
getLogFileSizeIfBeingWritten
if the givenpathis being written currently, then return its length.This is used by replication to prevent replicating unacked log entries. See https://issues.apache.org/jira/browse/HBASE-14004 for more details.
- Specified by:
getLogFileSizeIfBeingWrittenin interfaceWALFileLengthProvider
-
appendData
Description copied from interface:WALAppend a set of data edits to the WAL. 'Data' here means that the content in the edits will also have transitioned through the memstore. The WAL is not flushed/sync'd after this transaction completes BUT on return this edit must have its region edit/sequence id assigned else it messes up our unification of mvcc and sequenceid. On returnkeywill have the region edit/sequence id filled in.- Specified by:
appendDatain interfaceWAL- Parameters:
info- the regioninfo associated with appendkey- Modified by this call; we add to it this edits region edit/sequence id.edits- Edits to append. MAY CONTAIN NO EDITS for case where we want to get an edit sequence id that is after all currently appended edits.- Returns:
- Returns a 'transaction id' and
keywill have the region edit/sequence id in it. - Throws:
IOException- See Also:
-
appendMarker
Description copied from interface:WALAppend an operational 'meta' event marker edit to the WAL. A marker meta edit could be a FlushDescriptor, a compaction marker, or a region event marker; e.g. region open or region close. The difference between a 'marker' append and a 'data' append as inWAL.appendData(RegionInfo, WALKeyImpl, WALEdit)is that a marker will not have transitioned through the memstore. The WAL is not flushed/sync'd after this transaction completes BUT on return this edit must have its region edit/sequence id assigned else it messes up our unification of mvcc and sequenceid. On returnkeywill have the region edit/sequence id filled in.- Specified by:
appendMarkerin interfaceWAL- Parameters:
info- the regioninfo associated with appendkey- Modified by this call; we add to it this edits region edit/sequence id.edits- Edits to append. MAY CONTAIN NO EDITS for case where we want to get an edit sequence id that is after all currently appended edits.- Returns:
- Returns a 'transaction id' and
keywill have the region edit/sequence id in it. - Throws:
IOException- See Also:
-
append
protected abstract long append(RegionInfo info, WALKeyImpl key, WALEdit edits, boolean inMemstore) throws IOException Append a set of edits to the WAL. The WAL is not flushed/sync'd after this transaction completes BUT on return this edit must have its region edit/sequence id assigned else it messes up our unification of mvcc and sequenceid. On returnkeywill have the region edit/sequence id filled in. NOTE: This appends, at a time that is usually after this call returns, starts a mvcc transaction by calling 'begin' wherein which we assign this update a sequenceid. At assignment time, we stamp all the passed in Cells inside WALEdit with their sequenceId. You must 'complete' the transaction this mvcc transaction by calling MultiVersionConcurrencyControl#complete(...) or a variant otherwise mvcc will get stuck. Do it in the finally of a try/finally block within which this appends lives and any subsequent operations like sync or update of memstore, etc. Get the WriteEntry to pass mvcc out of the passed in WALKeywalKeyparameter. Be warned that the WriteEntry is not immediately available on return from this method. It WILL be available subsequent to a sync of this append; otherwise, you will just have to wait on the WriteEntry to get filled in.- Parameters:
info- the regioninfo associated with appendkey- Modified by this call; we add to it this edits region edit/sequence id.edits- Edits to append. MAY CONTAIN NO EDITS for case where we want to get an edit sequence id that is after all currently appended edits.inMemstore- Always true except for case where we are writing a region event meta marker edit, for example, a compaction completion record into the WAL or noting a Region Open event. In these cases the entry is just so we can finish an unfinished compaction after a crash when the new Server reads the WAL on recovery, etc. These transition event 'Markers' do not go via the memstore. When memstore is false, we presume a Marker event edit.- Returns:
- Returns a 'transaction id' and
keywill have the region edit/sequence id in it. - Throws:
IOException
-
doAppend
- Throws:
IOException
-
createWriterInstance
protected abstract W createWriterInstance(org.apache.hadoop.fs.Path path) throws IOException, CommonFSUtils.StreamLacksCapabilityException -
doReplaceWriter
protected abstract void doReplaceWriter(org.apache.hadoop.fs.Path oldPath, org.apache.hadoop.fs.Path newPath, W nextWriter) throws IOException Notice that you need to clear therollRequestedflag in this method, as the new writer will begin to work before returning from this method. If we clear the flag after returning from this call, we may miss a roll request. The implementation class should choose a proper place to clear therollRequestedflag, so we do not miss a roll request, typically before you start writing to the new writer.- Throws:
IOException
-
doShutdown
- Throws:
IOException
-
doCheckLogLowReplication
-
doCheckSlowSync
Returns true if we exceeded the slow sync roll threshold over the last check interval -
checkLogLowReplication
-
getPipeline
This method gets the pipeline for the current WAL. -
getLogReplication
This method gets the datanode replication count for the current WAL. -
split
private static void split(org.apache.hadoop.conf.Configuration conf, org.apache.hadoop.fs.Path p) throws IOException - Throws:
IOException
-
getWriter
-
usage
-
main
Pass one or more log file names, and it will either dump out a text version onstdoutor split the specified log files.- Throws:
IOException
-