/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002-2006
* Sleepycat Software. All rights reserved.
*
* $Id: LockUpgrade.java,v 1.1 2006/05/06 08:59:10 ckaestne Exp $
*/
package com.sleepycat.je.txn;
/**
* LockUpgrade is a type safe enumeration of lock upgrade types. Methods on
* LockUpgrade objects are used to determine whether an upgrade is needed and,
* if so, how it should be handled.
*/
class LockUpgrade {
static final LockUpgrade ILLEGAL = new LockUpgrade
(null, false, true);
static final LockUpgrade EXISTING = new LockUpgrade
(null, false, false);
static final LockUpgrade WRITE_PROMOTE = new LockUpgrade
(LockType.WRITE, true, false);
static final LockUpgrade RANGE_READ_IMMED= new LockUpgrade
(LockType.RANGE_READ, false, false);
static final LockUpgrade RANGE_WRITE_IMMED = new LockUpgrade
(LockType.RANGE_WRITE, false, false);
static final LockUpgrade RANGE_WRITE_PROMOTE = new LockUpgrade
(LockType.RANGE_WRITE, true, false);
private LockType upgrade;
private boolean promotion;
private boolean illegal;
/**
* No upgrade types can be defined outside this class.
*/
private LockUpgrade(LockType upgrade, boolean promotion, boolean illegal) {
this.upgrade = upgrade;
this.promotion = promotion;
this.illegal = illegal;
}
/**
* This method is called to determine whether the upgrade is illegal.
* If true is returned, an internal error has occurred. This should never
* happen since RANGE_INSERT should never be requested along with other
* locks by the same locker; a separate locker is used for RANGE_INSERT
* locks.
*/
boolean getIllegal() {
return illegal;
}
/**
* This method is called first to determine whether an upgrade to a new
* lock type is needed, and what the new lock type should be. If null is
* returned, the existing lock should be unchanged and no upgrade is
* needed. If non-null is returned, an upgrade to the returned type should
* be performed; in this case, call getPromotion to determine how to do the
* upgrade.
*/
LockType getUpgrade() {
return upgrade;
}
/**
* This method is called when getUpgrade returns non-null to determine
* whether the upgrade is a true promotion or can be granted immediately.
* A true promotion is a change from read to write locking, and may require
* waiting if the write lock conflicts with a lock held by another locker.
* An upgrade that is not a promotion is just a type change, and never
* causes a lock conflict.
*/
boolean getPromotion() {
return promotion;
}
}