blob: 48e3b54722cc28fc7f6bb18480e03e441bd54cbf [file] [log] [blame]
/*-
* Copyright (C) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
*
* This file was distributed by Oracle as part of a version of Oracle Berkeley
* DB Java Edition made available at:
*
* http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
*
* Please see the LICENSE file included in the top-level directory of the
* appropriate version of Oracle Berkeley DB Java Edition for a copy of the
* license and additional information.
*/
package com.sleepycat.je.txn;
import java.util.List;
import java.util.Set;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.dbi.MemoryBudget;
/**
* A Lock embodies the lock state of an LSN. It includes a set of owners and
* a list of waiters.
*/
interface Lock {
/**
* Get a list of waiters for debugging and error messages.
*/
public List<LockInfo> getWaitersListClone();
/**
* Remove this locker from the waiter list.
*/
public void flushWaiter(Locker locker,
MemoryBudget mb,
int lockTableIndex);
/**
* Get a new Set of the owners.
*/
public Set<LockInfo> getOwnersClone(boolean cloneLockInfo);
/**
* Return true if locker is an owner of this Lock for lockType,
* false otherwise.
*
* This method is only used by unit tests.
*/
public boolean isOwner(Locker locker, LockType lockType);
/**
* Return true if locker is an owner of this Lock and this is a write
* lock.
*/
public boolean isOwnedWriteLock(Locker locker);
/**
* Returns the LockType if the given locker owns this lock, or null if the
* lock is not owned.
*/
public LockType getOwnedLockType(Locker locker);
/**
* Return true if locker is a waiter on this Lock.
*
* This method is only used by unit tests.
*/
public boolean isWaiter(Locker locker);
public int nWaiters();
public int nOwners();
/**
* Attempts to acquire the lock and returns the LockGrantType.
*
* Assumes we hold the lockTableLatch when entering this method.
*/
public LockAttemptResult lock(LockType requestType,
Locker locker,
boolean nonBlockingRequest,
boolean jumpAheadOfWaiters,
MemoryBudget mb,
int lockTableIndex)
throws DatabaseException;
/**
* Releases a lock and moves the next waiter(s) to the owners.
* @return
* - null if we were not the owner,
* - a non-empty set if owners should be notified after releasing,
* - an empty set if no notification is required.
*/
public Set<Locker> release(Locker locker,
MemoryBudget mb,
int lockTableIndex);
/**
* Removes all owners except for the given owner (if non-null), and sets
* the Preempted property on the removed owners.
*/
public void stealLock(Locker locker, MemoryBudget mb, int lockTableIndex)
throws DatabaseException;
/**
* Downgrade a write lock to a read lock.
*/
public void demote(Locker locker);
/**
* Return the locker that has a write ownership on this lock. If no
* write owner exists, return null.
*/
public Locker getWriteOwnerLocker();
public boolean isThin();
/**
* Debug dumper.
*/
public String toString();
}