public class BuddyLocker extends BasicLocker
In general, a BuddyLocker can be used whenever the primary (API) locker is in use, and we need to lock a node and release that lock before the primary locker transaction ends. In other words, for this particular lock we don't want to use two-phase locking. To accomplish that we use a separate BuddyLocker instance to hold the lock, while sharing locks with the primary locker. The BuddyLocker can be closed to release this particular lock, without releasing the other locks held by the primary locker.
In particular, a BuddyLocker is used when acquiring a RANGE_INSERT lock. RANGE_INSERT only needs to be held until the point we have inserted the new node into the BIN. A separate locker is therefore used so we can release that lock separately when the insertion into the BIN is complete. But the RANGE_INSERT lock must not conflict with locks held by the primary locker. So a BuddyLocker is used that shares locks with the primary locker.
defaultNoWait, deleteInfo, envImpl, id, lockManager, readUncommittedDefault, thread
Modifier | Constructor and Description |
---|---|
protected |
BuddyLocker(EnvironmentImpl env,
Locker buddy)
Creates a BuddyLocker.
|
Modifier and Type | Method and Description |
---|---|
void |
checkPreempted(Locker allowPreemptedLocker)
Forwards to the parent buddy locker, so the buddy can check itself and
all of its child buddies.
|
(package private) void |
close()
Should be called by all subclasses when the locker is no longer used.
|
static BuddyLocker |
createBuddyLocker(EnvironmentImpl env,
Locker buddy) |
(package private) Locker |
getBuddy()
Returns the buddy locker.
|
long |
getLockTimeout()
Returns the lock timeout of the buddy locker, since this locker has no
independent timeout.
|
Transaction |
getTransaction()
Forwards this call to the buddy locker.
|
Txn |
getTxnLocker()
Forwards this call to the buddy locker.
|
long |
getTxnTimeout()
Returns the transaction timeout of the buddy locker, since this locker
has no independent timeout.
|
boolean |
isReplicationDefined()
Consider this locker replication-defined if its buddy (Txn) is
replication-defined.
|
boolean |
isTimedOut()
Returns whether the buddy locker is timed out, since this locker has no
independent timeout.
|
void |
releaseNonTxnLocks()
Forwards this call to the base class and to the buddy locker.
|
void |
setLockTimeout(long timeout)
Sets the lock timeout of the buddy locker, since this locker has no
independent timeout.
|
void |
setOnlyAbortable(OperationFailureException cause)
Forwards to the buddy locker, since the buddy may be transactional.
|
void |
setTxnTimeout(long timeout)
Sets the transaction timeout of the buddy locker, since this locker has
no independent timeout.
|
boolean |
sharesLocksWith(Locker other)
Returns whether this locker can share locks with the given locker.
|
addLock, checkState, collectStats, createBasicLocker, createBasicLocker, createdNode, generateId, getWriteLockInfo, getWriteOwnerLocker, isReadCommittedIsolation, isSerializableIsolation, isTransactional, lockingRequired, lockInternal, markDeleteAtTxnEnd, moveWriteToReadLock, newNonTxnLocker, nonTxnOperationEnd, operationEnd, preLogWithoutLock, registerCursor, removeLock, unRegisterCursor
addBuddy, addDeleteInfo, addOpenedDatabase, allowReleaseLockAfterLsnChange, demoteLock, disallowReplicaWrite, dumpLockTable, getDefaultNoWait, getEnvironment, getId, getImportunate, getInitialLockTimeout, getPreemptable, getTxnStartMillis, getWaitingFor, isPreempted, isReadUncommittedDefault, isRolledBack, isValid, lock, lockAfterLsnChange, nonBlockingLock, openCursorHook, operationEnd, operationEnd, releaseLock, removeBuddy, setAllowMultithreadedAccess, setClosingLocker, setImportunate, setPreemptable, setPreempted, setWaitingFor, throwIfPreempted, toString
protected BuddyLocker(EnvironmentImpl env, Locker buddy)
public static BuddyLocker createBuddyLocker(EnvironmentImpl env, Locker buddy) throws DatabaseException
DatabaseException
void close()
Locker
Locker getBuddy()
public Txn getTxnLocker()
getTxnLocker
in class BasicLocker
public Transaction getTransaction()
getTransaction
in class Locker
public void releaseNonTxnLocks() throws DatabaseException
releaseNonTxnLocks
in class BasicLocker
DatabaseException
public boolean sharesLocksWith(Locker other)
sharesLocksWith
in class Locker
public long getLockTimeout()
getLockTimeout
in class Locker
public long getTxnTimeout()
getTxnTimeout
in class Locker
public void setLockTimeout(long timeout)
setLockTimeout
in class Locker
timeout
- The timeout value for the transaction lifetime, in
milliseconds. A value of 0 disables timeouts for the transaction.public void setTxnTimeout(long timeout)
setTxnTimeout
in class Locker
timeout
- The timeout value for the transaction lifetime, in
microseconds. A value of 0 disables timeouts for the transaction.public boolean isTimedOut()
isTimedOut
in class Locker
public void setOnlyAbortable(OperationFailureException cause)
setOnlyAbortable
in class Locker
public void checkPreempted(Locker allowPreemptedLocker) throws OperationFailureException
checkPreempted
in class Locker
allowPreemptedLocker
- is a locker that is being closed as the
result of a cursor move operation. If the operation is successful then
allowPreemptedLocker will be closed, and the fact that a lock has been
stolen from allowPreemptedLocker can be ignored.OperationFailureException
public boolean isReplicationDefined()
isReplicationDefined
in class Locker
Copyright (c) 2004-2012 Oracle. All rights reserved.