You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by da...@apache.org on 2013/12/11 14:39:53 UTC
svn commit: r1550135 - in /db/derby/code/trunk/java/engine/org/apache/derby:
iapi/store/access/ iapi/store/raw/ impl/sql/execute/ impl/store/access/
impl/store/access/btree/index/ impl/store/access/heap/
Author: dag
Date: Wed Dec 11 13:39:52 2013
New Revision: 1550135
URL: http://svn.apache.org/r1550135
Log:
DERBY-6419 Make BTree scan honor OPENMODE_LOCK_NOWAIT for row locks
Patch derby-6419-1 introduces a mode to avoid waiting for row locks in
BTeee scans. Using the debugger I can see that the current wait in
ConstraintCharactericsTest#testLocking, line 417 as of svn 1545394 is
no longer waiting with the patch, and stepping through the code in
IndexChanger I can see that the second next() which currently waits
returns immediately with an exception as desired.
Instead of overloading the current flag OPENMODE_LOCK_NOWAIT, I
introduced a new flag OPENMODE_LOCK_ROW_NOWAIT instead. The short
circuiting logic was added in B2IRowLocking3#LockRowOnPage: I had to
added an accessor to HeapController to get at the open_mode of the
base table's conglomerate; not sure if that's kosher or not. An
alternative could be to keep to flag in the B2IForwardScan object.
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/access/TransactionController.java
db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/raw/ContainerHandle.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/IndexChanger.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/RAMTransaction.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/btree/index/B2IRowLocking3.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/Heap.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/HeapController.java
Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/access/TransactionController.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/access/TransactionController.java?rev=1550135&r1=1550134&r2=1550135&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/access/TransactionController.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/access/TransactionController.java Wed Dec 11 13:39:52 2013
@@ -244,6 +244,15 @@ public interface TransactionController
static final int OPENMODE_LOCK_NOWAIT = 0x00000080;
/**
+ * The row lock request will not wait.
+ * <p>
+ * The request to get the row lock (any row lock including intent or
+ * "real" row level lock), will not wait if it can't be granted. A
+ * lock timeout will be returned.
+ **/
+ static final int OPENMODE_LOCK_ROW_NOWAIT = 0x00008000;
+
+ /**
* Constants used for the countOpen() call.
**/
public static final int OPEN_CONGLOMERATE = 0x01;
Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/raw/ContainerHandle.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/raw/ContainerHandle.java?rev=1550135&r1=1550134&r2=1550135&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/raw/ContainerHandle.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/raw/ContainerHandle.java Wed Dec 11 13:39:52 2013
@@ -144,6 +144,7 @@ public interface ContainerHandle
public static final int MODE_USE_UPDATE_LOCKS = 0x00001000; // external access
public static final int MODE_SECONDARY_LOCKED = 0x00002000; // external access
public static final int MODE_BASEROW_INSERT_LOCKED = 0x00004000; // external access
+ public static final int MODE_LOCK_ROW_NOWAIT = 0x00008000;
public static final int TEMPORARY_SEGMENT = -1;
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/IndexChanger.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/IndexChanger.java?rev=1550135&r1=1550134&r2=1550135&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/IndexChanger.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/IndexChanger.java Wed Dec 11 13:39:52 2013
@@ -467,8 +467,7 @@ class IndexChanger
ScanController idxScan = tc.openScan(
indexCID,
false,
- 0, // FIXME: want NO_WAIT but not yet implemented
- // for row locks in BTRee scan
+ TransactionController.OPENMODE_LOCK_ROW_NOWAIT,
TransactionController.MODE_RECORD,
TransactionController.ISOLATION_READ_COMMITTED_NOHOLDLOCK,
(FormatableBitSet)null, // retrieve all fields
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/RAMTransaction.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/RAMTransaction.java?rev=1550135&r1=1550134&r2=1550135&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/RAMTransaction.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/RAMTransaction.java Wed Dec 11 13:39:52 2013
@@ -438,6 +438,7 @@ public class RAMTransaction
ContainerHandle.MODE_DROP_ON_COMMIT |
ContainerHandle.MODE_OPEN_FOR_LOCK_ONLY |
ContainerHandle.MODE_LOCK_NOWAIT |
+ ContainerHandle.MODE_LOCK_ROW_NOWAIT |
ContainerHandle.MODE_TRUNCATE_ON_ROLLBACK |
ContainerHandle.MODE_FLUSH_ON_COMMIT |
ContainerHandle.MODE_NO_ACTIONS_ON_COMMIT |
@@ -498,6 +499,7 @@ public class RAMTransaction
TransactionController.OPENMODE_USE_UPDATE_LOCKS |
TransactionController.OPENMODE_FOR_LOCK_ONLY |
TransactionController.OPENMODE_LOCK_NOWAIT |
+ TransactionController.OPENMODE_LOCK_ROW_NOWAIT |
TransactionController.OPENMODE_SECONDARY_LOCKED)) != 0)
{
SanityManager.THROWASSERT(
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/btree/index/B2IRowLocking3.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/btree/index/B2IRowLocking3.java?rev=1550135&r1=1550134&r2=1550135&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/btree/index/B2IRowLocking3.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/btree/index/B2IRowLocking3.java Wed Dec 11 13:39:52 2013
@@ -24,6 +24,7 @@ package org.apache.derby.impl.store.acce
import org.apache.derby.shared.common.sanity.SanityManager;
import org.apache.derby.iapi.error.StandardException;
+import org.apache.derby.iapi.reference.SQLState;
import org.apache.derby.iapi.store.access.conglomerate.TransactionManager;
@@ -45,6 +46,7 @@ import org.apache.derby.impl.store.acces
import org.apache.derby.impl.store.access.btree.OpenBTree;
import org.apache.derby.impl.store.access.btree.BTreeRowPosition;
import org.apache.derby.impl.store.access.btree.WaitError;
+import org.apache.derby.impl.store.access.heap.HeapController;
/**
@@ -296,6 +298,11 @@ class B2IRowLocking3 implements BTreeLoc
aux_leaf = null;
}
+ if ((((HeapController)base_cc).getOpenConglomerate().getOpenMode() &
+ TransactionManager.OPENMODE_LOCK_ROW_NOWAIT) != 0) {
+ throw StandardException.newException(SQLState.LOCK_TIMEOUT);
+ }
+
base_cc.lockRow(
lock_row_loc,
lock_operation,
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/Heap.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/Heap.java?rev=1550135&r1=1550134&r2=1550135&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/Heap.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/Heap.java Wed Dec 11 13:39:52 2013
@@ -736,6 +736,15 @@ public class Heap
DynamicCompiledOpenConglomInfo dynamic_info)
throws StandardException
{
+ if (SanityManager.DEBUG) {
+ if ((open_mode &
+ TransactionController.OPENMODE_LOCK_ROW_NOWAIT) != 0) {
+ SanityManager.THROWASSERT(
+ "Bad open mode to Heap#openScan:" +
+ Integer.toHexString(open_mode));
+ }
+ }
+
// Heap scans do not suppport start and stop scan positions (these
// only make sense for ordered storage structures).
if (!RowUtil.isRowEmpty(startKeyValue)
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/HeapController.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/HeapController.java?rev=1550135&r1=1550134&r2=1550135&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/HeapController.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/HeapController.java Wed Dec 11 13:39:52 2013
@@ -737,4 +737,7 @@ public class HeapController
* Public Methods of XXXX class:
**************************************************************************
*/
+ public OpenConglomerate getOpenConglomerate() {
+ return open_conglom;
+ }
}