@InterfaceAudience.Private @InterfaceStability.Evolving public abstract class TxnHandler extends Object implements TxnStore, TxnStore.MutexAPI
Note on log messages: Please include txnid:X and lockid info using
JavaUtils.txnIdToString(long)
and JavaUtils.lockIdToString(long) in all messages.
The txnid:X and lockid:Y matches how Thrift object toString() methods are generated,
so keeping the format consistent makes grep'ing the logs much easier.
Note on HIVE_LOCKS.hl_last_heartbeat. For locks that are part of transaction, we set this 0 (would rather set it to NULL but Currently the DB schema has this NOT NULL) and only update/read heartbeat from corresponding transaction in TXNS.
In general there can be multiple metastores where this logic can execute, thus the DB is used to ensure proper mutexing of operations. Select ... For Update (or equivalent: either MsSql with(updlock) or actual Update stmt) is used to properly sequence operations. Most notably: 1. various sequence IDs are generated with aid of this mutex 2. ensuring that each (Hive) Transaction state is transitioned atomically. Transaction state includes its actual state (Open, Aborted) as well as it's lock list/component list. Thus all per transaction ops, either start by update/delete of the relevant TXNS row or do S4U on that row. This allows almost all operations to run at READ_COMMITTED and minimizes DB deadlocks. 3. checkLock() - this is mutexted entirely since we must ensure that while we check if some lock can be granted, no other (strictly speaking "earlier") lock can change state.
The exception to this is Derby which doesn't support proper S4U. Derby is always running embedded (this is the only supported configuration for Derby) in the same JVM as HiveMetaStoreHandler thus we use JVM wide lock to properly sequnce the operations.
If we ever decide to run remote Derby server, according to https://db.apache.org/derby/docs/10.0/manuals/develop/develop78.html all transactions will be seriazlied, so that would also work though has not been tested.
General design note: It's imperative that any operation on a txn (e.g. commit), ensure (atomically) that this txn is still valid and active. In the code this is usually achieved at the same time the txn record is locked for some operation.
Note on retry logic:
Metastore has retry logic in both RetryingMetaStoreClient
and RetryingHMSHandler. The retry logic there is very
generic and is not aware whether the operations are idempotent or not. (This is separate from
retry logic here in TxnHander which can/does retry DB errors intelligently). The worst case is
when an op here issues a successful commit against the RDBMS but the calling stack doesn't
receive the ack and retries. (If an op fails before commit, it's trivially idempotent)
Thus the ops here need to be made idempotent as much as possible or
the metstore call stack should have logic not to retry. There are RetrySemantics
annotations to document the behavior.
| Modifier and Type | Class and Description |
|---|---|
static class |
TxnHandler.ConfVars |
TxnStore.MUTEX_KEY, TxnStore.MutexAPITxnStore.MutexAPI.LockHandle| Modifier and Type | Field and Description |
|---|---|
protected org.apache.hadoop.conf.Configuration |
conf
Number of consecutive deadlocks we have seen
|
static TxnHandler.ConfVars |
ConfVars |
protected static DataSource |
connPoolCompactor |
protected static DatabaseProduct |
dbProduct |
protected MultiDataSourceJdbcResource |
jdbcResource |
protected static long |
openTxnTimeOutMillis |
protected static SQLGenerator |
sqlGenerator |
protected List<TransactionalMetaStoreEventListener> |
transactionalListeners |
ABORT_TXN_CLEANUP_TYPE, ABORTED_RESPONSE, ABORTED_STATE, CLEANING_RESPONSE, COMPACTION_STATES, DID_NOT_INITIATE, DID_NOT_INITIATE_RESPONSE, FAILED_RESPONSE, FAILED_STATE, INITIATED_RESPONSE, INITIATED_STATE, MAJOR_TYPE, MINOR_TYPE, POOL_COMPACTOR, POOL_MUTEX, POOL_TX, READY_FOR_CLEANING, REBALANCE_TYPE, REFUSED_RESPONSE, REFUSED_STATE, SUCCEEDED_RESPONSE, SUCCEEDED_STATE, TIMED_OUT_TXN_ABORT_BATCH_SIZE, TXN_KEY_START, WORKING_RESPONSE, WORKING_STATE| Constructor and Description |
|---|
TxnHandler() |
| Modifier and Type | Method and Description |
|---|---|
AbortCompactResponse |
abortCompactions(AbortCompactionRequest reqst)
Abort (rollback) a compaction.
|
void |
abortTxn(AbortTxnRequest rqst)
Abort (rollback) a transaction.
|
void |
abortTxns(AbortTxnsRequest rqst)
Abort (rollback) a list of transactions in one request.
|
TxnStore.MutexAPI.LockHandle |
acquireLock(String key)
The
key is name of the lock. |
void |
acquireLock(String key,
TxnStore.MutexAPI.LockHandle handle)
Same as
TxnStore.MutexAPI.acquireLock(String) but takes an already existing handle as input. |
void |
addDynamicPartitions(AddDynamicPartitions rqst)
Retry-by-caller note:
This may be retried after dbConn.commit.
|
void |
addWriteIdsToMinHistory(long txnid,
Map<String,Long> minOpenWriteIds) |
void |
addWriteNotificationLog(ListenerEvent acidWriteEvent)
Add the ACID write event information to writeNotificationLog table.
|
AllocateTableWriteIdsResponse |
allocateTableWriteIds(AllocateTableWriteIdsRequest rqst)
Allocate a write ID for the given table and associate it with a transaction
|
LockResponse |
checkLock(CheckLockRequest rqst)
Why doesn't this get a txnid as parameter? The caller should either know the txnid or know there isn't one.
|
long |
cleanupMaterializationRebuildLocks(ValidTxnList validTxnList,
long timeout) |
void |
cleanupRecords(HiveObjectType type,
Database db,
Table table,
Iterator<Partition> partitionIterator,
boolean keepTxnToWriteIdMetaData)
Clean up corresponding records in metastore tables when corresponding object is dropped,
specifically: TXN_COMPONENTS, COMPLETED_TXN_COMPONENTS, COMPACTION_QUEUE, COMPLETED_COMPACTIONS
Retry-by-caller note: this is only idempotent assuming it's only called by dropTable/Db/etc
operations.
|
void |
cleanupRecords(HiveObjectType type,
Database db,
Table table,
Iterator<Partition> partitionIterator,
long txnId) |
void |
commitTxn(CommitTxnRequest rqst)
Concurrency/isolation notes:
This is mutexed with
openTxns(OpenTxnRequest) and other commitTxn(CommitTxnRequest)
operations using select4update on NEXT_TXN_ID. |
CompactionResponse |
compact(CompactionRequest rqst)
Submit a compaction request into the queue.
|
void |
countOpenTxns()
Get the count for open transactions.
|
org.apache.hadoop.conf.Configuration |
getConf() |
protected Connection |
getDbConn(int isolationLevel,
DataSource connPool) |
protected Timestamp |
getDbTime()
Determine the current time, using the RDBMS as a source of truth
|
MultiDataSourceJdbcResource |
getJdbcResourceHolder() |
GetLatestCommittedCompactionInfoResponse |
getLatestCommittedCompactionInfo(GetLatestCommittedCompactionInfoRequest rqst)
We assume this is only called by metadata cache server to know if there are new base/delta files should be read.
|
long |
getLatestTxnIdInConflict(long txnid)
Checks if there are transactions that are overlapping, i.e.
|
Materialization |
getMaterializationInvalidationInfo(CreationMetadata creationMetadata,
String validTxnListStr)
Get invalidation info for the materialization.
|
MaxAllocatedTableWriteIdResponse |
getMaxAllocatedTableWrited(MaxAllocatedTableWriteIdRequest rqst)
Reads the maximum allocated writeId for the given table
|
MetricsInfo |
getMetricsInfo()
Returns ACID metadata related metrics info.
|
TxnStore.MutexAPI |
getMutexAPI() |
int |
getNumLocks()
TODO: remove in future, for testing only, do not use.
|
GetOpenTxnsResponse |
getOpenTxns()
Get list of valid transactions.
|
GetOpenTxnsResponse |
getOpenTxns(List<TxnType> excludeTxnTypes)
Get list of valid transactions.
|
GetOpenTxnsInfoResponse |
getOpenTxnsInfo()
Get information about open transactions.
|
long |
getOpenTxnTimeOutMillis() |
SqlRetryHandler |
getRetryHandler() |
long |
getTargetTxnId(String replPolicy,
long sourceTxnId) |
long |
getTxnIdForWriteId(String dbName,
String tblName,
long writeId) |
GetValidWriteIdsResponse |
getValidWriteIds(GetValidWriteIdsRequest rqst)
Gets the list of valid write ids for the given table wrt to current txn
|
void |
heartbeat(HeartbeatRequest ids)
ids should only have txnid or lockid but not both, ideally. |
boolean |
heartbeatLockMaterializationRebuild(String dbName,
String tableName,
long txnId) |
HeartbeatTxnRangeResponse |
heartbeatTxnRange(HeartbeatTxnRangeRequest rqst)
Heartbeat a group of transactions together
|
LockResponse |
lock(LockRequest rqst)
As much as possible (i.e.
|
LockResponse |
lockMaterializationRebuild(String dbName,
String tableName,
long txnId) |
void |
onRename(String oldCatName,
String oldDbName,
String oldTabName,
String oldPartName,
String newCatName,
String newDbName,
String newTabName,
String newPartName)
Catalog hasn't been added to transactional tables yet, so it's passed in but not used.
|
OpenTxnsResponse |
openTxns(OpenTxnRequest rqst)
Retry-by-caller note:
Worst case, it will leave an open txn which will timeout.
|
void |
performTimeOuts()
Isolation Level Notes
Plain: RC is OK
This will find transactions that have timed out and abort them.
|
void |
performWriteSetGC()
WriteSet tracking is used to ensure proper transaction isolation.
|
void |
replTableWriteIdState(ReplTblWriteIdStateRequest rqst)
Replicate Table Write Ids state to mark aborted write ids and writeid high watermark.
|
void |
seedTxnId(SeedTxnIdRequest rqst)
Sets the next txnId to the given value.
|
void |
seedWriteId(SeedTableWriteIdsRequest rqst)
Called on conversion of existing table to full acid.
|
void |
setConf(org.apache.hadoop.conf.Configuration conf)
This is logically part of c'tor and must be called prior to any other method.
|
void |
setOpenTxnTimeOutMillis(long openTxnTimeOutMillis) |
long |
setTimeout(long milliseconds)
TODO: remove in future, for testing only, do not use.
|
protected static DataSource |
setupJdbcConnectionPool(org.apache.hadoop.conf.Configuration conf,
int maxPoolSize) |
ShowCompactResponse |
showCompact(ShowCompactRequest rqst)
Show list of current compactions.
|
ShowLocksResponse |
showLocks(ShowLocksRequest rqst)
Get information on current locks.
|
boolean |
submitForCleanup(CompactionRequest rqst,
long highestWriteId,
long txnId) |
void |
unlock(UnlockRequest rqst)
This would have been made simpler if all locks were associated with a txn.
|
void |
updateTransactionStatistics(UpdateTransactionalStatsRequest req) |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitcheckFailedCompactions, cleanEmptyAbortedAndCommittedTxns, cleanTxnToWriteIdTable, cleanupRecords, clearCleanerStart, findColumnsWithStats, findMinOpenTxnIdForCleaner, findMinTxnIdSeenOpen, findNextToCompact, findNextToCompact, findPotentialCompactions, findPotentialCompactions, findReadyToClean, findReadyToCleanAborts, getCompactionByTxnId, getCompactionMetricsData, getTopCompactionMetricsDataPerType, markCleaned, markCleanerStart, markCompacted, markFailed, markRefused, purgeCompactionHistory, removeCompactionMetricsData, removeDuplicateCompletedTxnComponents, revokeFromLocalWorkers, revokeTimedoutWorkers, setCleanerRetryRetentionTimeOnError, setHadoopJobId, updateCompactionMetricsData, updateCompactorStatepublic static final TxnHandler.ConfVars ConfVars
protected static DataSource connPoolCompactor
protected static DatabaseProduct dbProduct
protected static SQLGenerator sqlGenerator
protected static long openTxnTimeOutMillis
protected org.apache.hadoop.conf.Configuration conf
protected List<TransactionalMetaStoreEventListener> transactionalListeners
protected MultiDataSourceJdbcResource jdbcResource
public void setConf(org.apache.hadoop.conf.Configuration conf)
setConf in interface org.apache.hadoop.conf.Configurablepublic SqlRetryHandler getRetryHandler()
getRetryHandler in interface TxnStoreSqlRetryHandler instance used by TxnStore.public MultiDataSourceJdbcResource getJdbcResourceHolder()
getJdbcResourceHolder in interface TxnStoreMultiDataSourceJdbcResource instance used by TxnStore.public org.apache.hadoop.conf.Configuration getConf()
getConf in interface org.apache.hadoop.conf.Configurablepublic GetOpenTxnsInfoResponse getOpenTxnsInfo() throws MetaException
TxnStoregetOpenTxnsInfo in interface TxnStoreMetaExceptionpublic GetOpenTxnsResponse getOpenTxns() throws MetaException
TxnStoregetOpenTxns in interface TxnStoreMetaExceptionpublic GetOpenTxnsResponse getOpenTxns(List<TxnType> excludeTxnTypes) throws MetaException
TxnStoregetOpenTxns in interface TxnStoreexcludeTxnTypes - : excludes this type of txns while getting the open txnsMetaExceptionpublic OpenTxnsResponse openTxns(OpenTxnRequest rqst) throws MetaException
openTxns in interface TxnStorerqst - request to open transactionsMetaExceptionpublic long getOpenTxnTimeOutMillis()
getOpenTxnTimeOutMillis in interface TxnStorepublic void setOpenTxnTimeOutMillis(long openTxnTimeOutMillis)
setOpenTxnTimeOutMillis in interface TxnStorepublic long getTargetTxnId(String replPolicy, long sourceTxnId) throws MetaException
getTargetTxnId in interface TxnStoreMetaExceptionpublic void abortTxn(AbortTxnRequest rqst) throws NoSuchTxnException, MetaException, TxnAbortedException
TxnStoreabortTxn in interface TxnStorerqst - info on transaction to abortNoSuchTxnExceptionMetaExceptionTxnAbortedExceptionpublic void abortTxns(AbortTxnsRequest rqst) throws MetaException
TxnStoreabortTxns in interface TxnStorerqst - info on transactions to abortMetaExceptionpublic void commitTxn(CommitTxnRequest rqst) throws NoSuchTxnException, TxnAbortedException, MetaException
openTxns(OpenTxnRequest) and other commitTxn(CommitTxnRequest)
operations using select4update on NEXT_TXN_ID. Also, mutexes on TXNS table for specific txnid:X
see more notes below.
In order to prevent lost updates, we need to determine if any 2 transactions overlap. Each txn
is viewed as an interval [M,N]. M is the txnid and N is taken from the same NEXT_TXN_ID sequence
so that we can compare commit time of txn T with start time of txn S. This sequence can be thought of
as a logical time counter. If S.commitTime < T.startTime, T and S do NOT overlap.
Motivating example:
Suppose we have multi-statement transactions T and S both of which are attempting x = x + 1
In order to prevent lost update problem, then the non-overlapping txns must lock in the snapshot
that they read appropriately. In particular, if txns do not overlap, then one follows the other
(assuming they write the same entity), and thus the 2nd must see changes of the 1st. We ensure
this by locking in snapshot after
openTxns(OpenTxnRequest) call is made (see org.apache.hadoop.hive.ql.Driver.acquireLocksAndOpenTxn)
and mutexing openTxn() with commit(). In other words, once a S.commit() starts we must ensure
that txn T which will be considered a later txn, locks in a snapshot that includes the result
of S's commit (assuming no other txns).
As a counter example, suppose we have S[3,3] and T[4,4] (commitId=txnid means no other transactions
were running in parallel). If T and S both locked in the same snapshot (for example commit of
txnid:2, which is possible if commitTxn() and openTxnx() is not mutexed)
'x' would be updated to the same value by both, i.e. lost update.
commitTxn in interface TxnStorerqst - info on transaction to commitNoSuchTxnExceptionTxnAbortedExceptionMetaExceptionpublic long getLatestTxnIdInConflict(long txnid)
throws MetaException
getLatestTxnIdInConflict in interface TxnStoretxnid - MetaExceptionpublic void replTableWriteIdState(ReplTblWriteIdStateRequest rqst) throws MetaException
replTableWriteIdState in interface TxnStorerqst - info on table/partitions and writeid snapshot to replicate.MetaExceptionpublic GetValidWriteIdsResponse getValidWriteIds(GetValidWriteIdsRequest rqst) throws MetaException
TxnStoregetValidWriteIds in interface TxnStorerqst - info on transaction and list of table names associated with given transactionMetaExceptionpublic AllocateTableWriteIdsResponse allocateTableWriteIds(AllocateTableWriteIdsRequest rqst) throws MetaException
TxnStoreallocateTableWriteIds in interface TxnStorerqst - info on transaction and table to allocate write idMetaExceptionpublic MaxAllocatedTableWriteIdResponse getMaxAllocatedTableWrited(MaxAllocatedTableWriteIdRequest rqst) throws MetaException
TxnStoregetMaxAllocatedTableWrited in interface TxnStorerqst - table for which the maximum writeId is requestedMetaExceptionpublic void seedWriteId(SeedTableWriteIdsRequest rqst) throws MetaException
TxnStoreseedWriteId in interface TxnStoreMetaExceptionpublic void seedTxnId(SeedTxnIdRequest rqst) throws MetaException
TxnStoreseedTxnId in interface TxnStoreMetaExceptionpublic void addWriteNotificationLog(ListenerEvent acidWriteEvent) throws MetaException
TxnStoreaddWriteNotificationLog in interface TxnStoreMetaExceptionpublic void performWriteSetGC()
throws MetaException
TxnStoreperformWriteSetGC in interface TxnStoreMetaExceptionpublic void updateTransactionStatistics(UpdateTransactionalStatsRequest req) throws MetaException
updateTransactionStatistics in interface TxnStoreMetaExceptionpublic Materialization getMaterializationInvalidationInfo(CreationMetadata creationMetadata, String validTxnListStr) throws MetaException
getMaterializationInvalidationInfo in interface TxnStorecreationMetadata - creation metadata for the materializationvalidTxnListStr - valid transaction list for snapshot taken for current queryMetaExceptionpublic LockResponse lockMaterializationRebuild(String dbName, String tableName, long txnId) throws MetaException
lockMaterializationRebuild in interface TxnStoreMetaExceptionpublic boolean heartbeatLockMaterializationRebuild(String dbName, String tableName, long txnId) throws MetaException
heartbeatLockMaterializationRebuild in interface TxnStoreMetaExceptionpublic long cleanupMaterializationRebuildLocks(ValidTxnList validTxnList, long timeout) throws MetaException
cleanupMaterializationRebuildLocks in interface TxnStoreMetaExceptionpublic LockResponse lock(LockRequest rqst) throws NoSuchTxnException, TxnAbortedException, MetaException
LOCK_WAITING
mode and response gets lost. Then RetryingMetaStoreClient
retries, and enqueues another set of locks in LOCK_WAITING. The 2nd LockResponse is delivered
to the DbLockManager, which will keep dong checkLock(CheckLockRequest) until the 1st
set of locks times out.lock in interface TxnStorerqst - information on the lock to obtain. If the requester is part of a transaction
the txn information must be included in the lock request.NoSuchTxnExceptionTxnAbortedExceptionMetaExceptionpublic LockResponse checkLock(CheckLockRequest rqst) throws NoSuchTxnException, NoSuchLockException, TxnAbortedException, MetaException
Also, when lock acquisition returns WAITING, it's retried every 15 seconds (best case, see DbLockManager.backoff(), in practice more often) which means this is heartbeating way more often than hive.txn.timeout and creating extra load on DB.
The clients that operate in blocking mode, can't heartbeat a lock until the lock is acquired. We should make CheckLockRequest include timestamp or last request to skip unnecessary heartbeats. Thrift change.
checkLock(CheckLockRequest) must run at SERIALIZABLE
(make sure some lock we are checking against doesn't move from W to A in another txn)
but this method can heartbeat in separate txn at READ_COMMITTED.
Retry-by-caller note:
Retryable because checkLock(CheckLockRequest) is
checkLock in interface TxnStorerqst - info on the lock to checkNoSuchTxnExceptionNoSuchLockExceptionTxnAbortedExceptionMetaExceptionpublic void unlock(UnlockRequest rqst) throws TxnOpenException, MetaException
unlock in interface TxnStorerqst - lock to unlockTxnOpenExceptionMetaExceptionpublic ShowLocksResponse showLocks(ShowLocksRequest rqst) throws MetaException
TxnStoreshowLocks in interface TxnStorerqst - lock information to retrieveMetaExceptionpublic void heartbeat(HeartbeatRequest ids) throws NoSuchTxnException, NoSuchLockException, TxnAbortedException, MetaException
ids should only have txnid or lockid but not both, ideally.
Currently DBTxnManager.heartbeat() enforces this.heartbeat in interface TxnStoreids - lock and/or txn id to heartbeatNoSuchTxnExceptionNoSuchLockExceptionTxnAbortedExceptionMetaExceptionpublic HeartbeatTxnRangeResponse heartbeatTxnRange(HeartbeatTxnRangeRequest rqst) throws MetaException
TxnStoreheartbeatTxnRange in interface TxnStorerqst - set of transactions to heartbatMetaExceptionpublic long getTxnIdForWriteId(String dbName, String tblName, long writeId) throws MetaException
getTxnIdForWriteId in interface TxnStoreMetaExceptionpublic CompactionResponse compact(CompactionRequest rqst) throws MetaException
TxnStorecompact in interface TxnStorerqst - information on what to compactMetaExceptionpublic boolean submitForCleanup(CompactionRequest rqst, long highestWriteId, long txnId) throws MetaException
submitForCleanup in interface TxnStoreMetaExceptionpublic ShowCompactResponse showCompact(ShowCompactRequest rqst) throws MetaException
TxnStoreshowCompact in interface TxnStorerqst - info on which compactions to showMetaExceptionpublic GetLatestCommittedCompactionInfoResponse getLatestCommittedCompactionInfo(GetLatestCommittedCompactionInfoRequest rqst) throws MetaException
getLatestCommittedCompactionInfo in interface TxnStorerqst - info on which compaction to retrieveMetaExceptionpublic MetricsInfo getMetricsInfo() throws MetaException
TxnStoregetMetricsInfo in interface TxnStoreMetaExceptionpublic void addDynamicPartitions(AddDynamicPartitions rqst) throws NoSuchTxnException, TxnAbortedException, MetaException
commitTxn(CommitTxnRequest)addDynamicPartitions in interface TxnStorerqst - dynamic partition info.NoSuchTxnExceptionTxnAbortedExceptionMetaExceptionpublic void cleanupRecords(HiveObjectType type, Database db, Table table, Iterator<Partition> partitionIterator, boolean keepTxnToWriteIdMetaData) throws MetaException
HIVE_LOCKS and WS_SET are cleaned up by AcidHouseKeeperService, if turned on
cleanupRecords in interface TxnStoreMetaExceptionpublic void cleanupRecords(HiveObjectType type, Database db, Table table, Iterator<Partition> partitionIterator, long txnId) throws MetaException
cleanupRecords in interface TxnStoreMetaExceptionpublic void onRename(String oldCatName, String oldDbName, String oldTabName, String oldPartName, String newCatName, String newDbName, String newTabName, String newPartName) throws MetaException
onRename in interface TxnStoreMetaExceptionpublic int getNumLocks()
getNumLocks in interface TxnStorepublic long setTimeout(long milliseconds)
setTimeout in interface TxnStoreprotected Connection getDbConn(int isolationLevel, DataSource connPool) throws SQLException
SQLExceptionpublic void performTimeOuts()
performTimeOuts in interface TxnStorepublic void countOpenTxns()
throws MetaException
TxnStorecountOpenTxns in interface TxnStoreMetaExceptionpublic void addWriteIdsToMinHistory(long txnid,
Map<String,Long> minOpenWriteIds)
throws MetaException
addWriteIdsToMinHistory in interface TxnStoreMetaExceptionprotected static DataSource setupJdbcConnectionPool(org.apache.hadoop.conf.Configuration conf, int maxPoolSize)
public TxnStore.MutexAPI getMutexAPI()
getMutexAPI in interface TxnStorepublic TxnStore.MutexAPI.LockHandle acquireLock(String key) throws MetaException
TxnStore.MutexAPIkey is name of the lock. Will acquire an exclusive lock or block. It returns
a handle which must be used to release the lock. Each invocation returns a new handle.acquireLock in interface TxnStore.MutexAPIMetaExceptionpublic void acquireLock(String key, TxnStore.MutexAPI.LockHandle handle) throws MetaException
TxnStore.MutexAPITxnStore.MutexAPI.acquireLock(String) but takes an already existing handle as input. This
will associate the lock on key with the same handle. All locks associated with
the same handle will be released together.acquireLock in interface TxnStore.MutexAPIhandle - not NULLMetaExceptionpublic AbortCompactResponse abortCompactions(AbortCompactionRequest reqst) throws MetaException, NoSuchCompactionException
TxnStoreabortCompactions in interface TxnStorereqst - info on compaction to abortMetaExceptionNoSuchCompactionExceptionprotected Timestamp getDbTime() throws MetaException
MetaException - if the time cannot be determinedCopyright © 2024 The Apache Software Foundation. All rights reserved.