01: /*-
02: * See the file LICENSE for redistribution information.
03: *
04: * Copyright (c) 2002,2008 Oracle. All rights reserved.
05: *
06: * $Id: LockUpgrade.java,v 1.5.2.2 2008/01/07 15:14:17 cwl Exp $
07: */
08:
09: package com.sleepycat.je.txn;
10:
11: /**
12: * LockUpgrade is a type safe enumeration of lock upgrade types. Methods on
13: * LockUpgrade objects are used to determine whether an upgrade is needed and,
14: * if so, how it should be handled.
15: */
16: class LockUpgrade {
17:
18: static final LockUpgrade ILLEGAL = new LockUpgrade(null, false,
19: true);
20: static final LockUpgrade EXISTING = new LockUpgrade(null, false,
21: false);
22: static final LockUpgrade WRITE_PROMOTE = new LockUpgrade(
23: LockType.WRITE, true, false);
24: static final LockUpgrade RANGE_READ_IMMED = new LockUpgrade(
25: LockType.RANGE_READ, false, false);
26: static final LockUpgrade RANGE_WRITE_IMMED = new LockUpgrade(
27: LockType.RANGE_WRITE, false, false);
28: static final LockUpgrade RANGE_WRITE_PROMOTE = new LockUpgrade(
29: LockType.RANGE_WRITE, true, false);
30:
31: private LockType upgrade;
32: private boolean promotion;
33: private boolean illegal;
34:
35: /**
36: * No upgrade types can be defined outside this class.
37: */
38: private LockUpgrade(LockType upgrade, boolean promotion,
39: boolean illegal) {
40: this .upgrade = upgrade;
41: this .promotion = promotion;
42: this .illegal = illegal;
43: }
44:
45: /**
46: * This method is called to determine whether the upgrade is illegal.
47: * If true is returned, an internal error has occurred. This should never
48: * happen since RANGE_INSERT should never be requested along with other
49: * locks by the same locker; a separate locker is used for RANGE_INSERT
50: * locks.
51: */
52: boolean getIllegal() {
53: return illegal;
54: }
55:
56: /**
57: * This method is called first to determine whether an upgrade to a new
58: * lock type is needed, and what the new lock type should be. If null is
59: * returned, the existing lock should be unchanged and no upgrade is
60: * needed. If non-null is returned, an upgrade to the returned type should
61: * be performed; in this case, call getPromotion to determine how to do the
62: * upgrade.
63: */
64: LockType getUpgrade() {
65: return upgrade;
66: }
67:
68: /**
69: * This method is called when getUpgrade returns non-null to determine
70: * whether the upgrade is a true promotion or can be granted immediately.
71: * A true promotion is a change from read to write locking, and may require
72: * waiting if the write lock conflicts with a lock held by another locker.
73: * An upgrade that is not a promotion is just a type change, and never
74: * causes a lock conflict.
75: */
76: boolean getPromotion() {
77: return promotion;
78: }
79: }
|