Issue Details (XML | Word | Printable)

Key: DERBY-3693
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Major Major
Assignee: Knut Anders Hatlen
Reporter: Svata Dedic
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Derby

Deadlocks accessing DB metadata

Created: 27/May/08 08:55 PM   Updated: 04/May/09 06:22 PM
Return to search
Component/s: JDBC
Affects Version/s: 10.3.2.1, 10.3.3.0, 10.4.1.3
Fix Version/s: 10.4.2.0, 10.5.1.1

Time Tracking:
Not Specified

File Attachments:
  Size
File Licensed for inclusion in ASF works comments.diff 2008-08-25 03:50 PM Knut Anders Hatlen 7 kB
Java Source File Licensed for inclusion in ASF works d3693.java 2008-06-20 02:13 PM Knut Anders Hatlen 3 kB
Text File Licensed for inclusion in ASF works deadlock.diff 2008-05-29 12:26 PM Knut Anders Hatlen 1 kB
Text File derby.log 2008-07-17 08:12 PM David Capelle 1.00 MB
File Licensed for inclusion in ASF works dontWait.diff 2008-08-22 02:56 PM Knut Anders Hatlen 25 kB
Text File Licensed for inclusion in ASF works dontWait.stat 2008-08-22 02:56 PM Knut Anders Hatlen 1 kB
Java Source File Licensed for inclusion in ASF works GetTables.java 2008-07-18 09:02 AM Knut Anders Hatlen 1 kB
File Licensed for inclusion in ASF works nested_transaction.diff 2008-07-25 08:04 PM Knut Anders Hatlen 3 kB
File Licensed for inclusion in ASF works nested_transaction_v2.diff 2008-08-21 11:48 AM Knut Anders Hatlen 9 kB
Environment: Linux amd64 or Windows 32bit
Issue Links:
Duplicate
 
Reference
 

Resolution Date: 25/Aug/08 04:09 PM


 Description  « Hide
My code changes DB structure (create a column), then immediately after setting autocommit back to true, the code rescans the DB metadata
DatabaseMetaData.getColumns(catalog, schemaName, tableName, null);

I am sometimes getting a deadlock with these operations:

2008-04-16 19:50:47.833 GMT Thread[Default RequestProcessor,1,system] (XID = 569844), (SESSIONID = 2), (DATABASE = /..../a3/.config/localdb/db), (DRDAID = null), Cleanup action starting 2008-04-16 19:50:47.833 GMT Thread[Default RequestProcessor,1,system] (XID = 569844), (SESSIONID = 2), (DATABASE = /..../IJCProjects/a3/.config/localdb/db), (DRDAID = null), Failed Statement is: EXECUTE STATEMENT SYS."getColumns" ERROR 40XL2: A lock could not be obtained within the time requested.

The lockTable dump is:
2008-04-16 19:50:47.796 GMT
XID |TYPE |MODE|LOCKCOUNT|LOCKNAME |STATE|TABLETYPE /LOCKOBJ |INDEXNAME / CONTAINER_ID / MODE for LATCH only) |TABLENAME / CONGLOM_ID |
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*** The following row is the victim ***
569852 |ROW |X |0 |(44,7) |WAIT |S |NULL |SYSSTATEMENTS |
*** The above row is the victim ***

The stacktrace of the operation causing the deadlock is
        at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
        at org.apache.derby.impl.services.locks.Timeout.createException(Unknown Source)
        at org.apache.derby.impl.services.locks.Timeout.buildException(Unknown Source)
        at org.apache.derby.impl.services.locks.ConcurrentLockSet.lockObject(Unknown Source)
        at org.apache.derby.impl.services.locks.AbstractPool.lockObject(Unknown Source)
        at org.apache.derby.impl.services.locks.ConcurrentPool.lockObject(Unknown Source)
        at org.apache.derby.impl.store.raw.xact.RowLocking3.lockRecordForWrite(Unknown Source)
        at org.apache.derby.impl.store.access.heap.HeapController.lockRow(Unknown Source)
        at org.apache.derby.impl.store.access.heap.HeapController.lockRow(Unknown Source)
        at org.apache.derby.impl.store.access.btree.index.B2IRowLocking3.lockRowOnPage(Unknown Source)
        at org.apache.derby.impl.store.access.btree.index.B2IRowLocking3._lockScanRow(Unknown Source)
        at org.apache.derby.impl.store.access.btree.index.B2IRowLockingRR.lockScanRow(Unknown Source)
        at org.apache.derby.impl.store.access.btree.BTreeForwardScan.fetchRows(Unknown Source)
        at org.apache.derby.impl.store.access.btree.BTreeScan.fetchNext(Unknown Source)
        at org.apache.derby.impl.sql.catalog.TabInfoImpl.updateRow(Unknown Source)
        at org.apache.derby.impl.sql.catalog.TabInfoImpl.updateRow(Unknown Source)
        at org.apache.derby.impl.sql.catalog.DataDictionaryImpl.updateSPS(Unknown Source )
        at org.apache.derby.iapi.sql.dictionary.SPSDescriptor.updateSYSSTATEMENTS(Unknown Source)
        at org.apache.derby.iapi.sql.dictionary.SPSDescriptor.getPreparedStatement(Unknown Source)
        at org.apache.derby.iapi.sql.dictionary.SPSDescriptor.getPreparedStatement(Unknown Source)
        at org.apache.derby.impl.sql.compile.ExecSPSNode.generate(Unknown Source)
        at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
        at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
        at org.apache.derby.impl.sql.GenericPreparedStatement.rePrepare(Unknown Source)
        at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeQuery(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.doGetCols(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedDatabaseMetaData.getColumns(Unknown Source)

I've seen the deadlock occur during several get-metadata operations (getImportedKeys, ...), each time waiting on the SYSSTATEMENTS apparently because of internally constructed PreparedStatement. The lock eventually times out and the locked out operation completes without error.

When the deadlock occurs, the "real" SQL into systables is being compiled (I traced this sql to be the value of "getColumns" key in org/apache/derby/impl/jdbc/metadata.properties file):
---------%<-----------------------%<--------------
Begin compiling prepared statement: SELECT CAST ('' AS VARCHAR(128)) AS PKTABLE_CAT, S.SCHEMANAME AS PKTABLE_SCHEM, TABLENAME AS
PKTABLE_NAME, COLS.COLUMNNAME AS PKCOLUMN_NAME, CAST ('' AS VARCHAR(128)) AS FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, FKCOLUMN_NAME, CAST ...
---------%<-----------------------%<--------------


 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Repository Revision Date User Message
ASF #688274 Sat Aug 23 07:35:47 UTC 2008 kahatlen DERBY-3693: Deadlocks accessing DB metadata

Make sure that the nested transaction used to recompile meta-data
queries does not wait for locks to prevent hangs when there's a lock
conflict between the nested transaction and the user transaction.
Files Changed
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/services/locks/AbstractPool.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/services/locks/ConcurrentLockSet.java
MODIFY /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/DatabaseMetaDataTest.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/services/locks/LockSpace.java
MODIFY /db/derby/code/trunk/java/storeless/org/apache/derby/impl/storeless/NoOpTransaction.java
ADD /db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/locks/LockOwner.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/services/locks/LockSet.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/SPSDescriptor.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/locks/LockFactory.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/services/reflect/UpdateLoader.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/locks/CompatibilitySpace.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/RAMTransaction.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/xact/Xact.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/raw/Transaction.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/access/TransactionController.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/services/locks/LockTable.java

Repository Revision Date User Message
ASF #688756 Mon Aug 25 15:28:35 UTC 2008 kahatlen DERBY-3693: Deadlocks accessing DB metadata

Added more detailed comments and cross references in the javadoc.
Files Changed
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/RAMTransaction.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/locks/LockOwner.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/raw/Transaction.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/xact/Xact.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/access/TransactionController.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/SPSDescriptor.java

Repository Revision Date User Message
ASF #688766 Mon Aug 25 15:54:49 UTC 2008 kahatlen DERBY-3693: Deadlocks accessing DB metadata

Merged fix from trunk (revisions 688274 and 688756).
Files Changed
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/iapi/services/locks/LockFactory.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/iapi/services/locks/CompatibilitySpace.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/impl/services/reflect/UpdateLoader.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/impl/store/access/RAMTransaction.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/impl/store/raw/xact/Xact.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/iapi/store/raw/Transaction.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/iapi/store/access/TransactionController.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/impl/services/locks/LockTable.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/impl/services/locks/AbstractPool.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/impl/services/locks/ConcurrentLockSet.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/impl/services/locks/LockSpace.java
MODIFY /db/derby/code/branches/10.4/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/DatabaseMetaDataTest.java
MODIFY /db/derby/code/branches/10.4/java/storeless/org/apache/derby/impl/storeless/NoOpTransaction.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/impl/services/locks/LockSet.java
ADD /db/derby/code/branches/10.4/java/engine/org/apache/derby/iapi/services/locks/LockOwner.java (from /db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/locks/LockOwner.java)
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/iapi/sql/dictionary/SPSDescriptor.java

Repository Revision Date User Message
ASF #691993 Thu Sep 04 12:39:58 UTC 2008 kahatlen DERBY-3850: Remove unneeded workarounds for DERBY-177 and DERBY-3693

Removed calls to DatabasePropertyTestSetup.setLockTimeout() from some
tests since the bug that caused the hang has been fixed.
Files Changed
MODIFY /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/DatabaseMetaDataTest.java
MODIFY /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UpdatableResultSetTest.java

Repository Revision Date User Message
ASF #692495 Fri Sep 05 17:22:24 UTC 2008 kahatlen DERBY-3850: Remove unneeded workarounds for DERBY-177 and DERBY-3693

Removed the wait parameter from methods called from
SPSDescriptor.updateSYSSTATEMENTS() since waiting is prevented by
another mechanism now.
Files Changed
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/depend/BasicDependencyManager.java
MODIFY /db/derby/code/trunk/java/storeless/org/apache/derby/impl/storeless/EmptyDictionary.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/TabInfoImpl.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/CreateTriggerConstantAction.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/DataDictionary.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/dictionary/SPSDescriptor.java

Repository Revision Date User Message
ASF #692908 Sun Sep 07 17:34:39 UTC 2008 kahatlen DERBY-3850: Remove unneeded workarounds for DERBY-177 and DERBY-3693

Removed workaround in lang/predicatesIntoViews.sql.
Files Changed
MODIFY /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/predicatesIntoViews.out
MODIFY /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/predicatesIntoViews.sql

Repository Revision Date User Message
ASF #695244 Sun Sep 14 15:57:45 UTC 2008 kahatlen DERBY-3850: Remove unneeded workarounds for DERBY-177 and DERBY-3693

Removed the wait parameter from TabInfoImpl.updateRow(). The method
only had two callers, both of which called it with
wait=true. updateRow() passed the parameter on to openForUpdate() in
RowChanger, but that method is sometimes called with wait=false, so
the parameter couldn't be removed from that method.

Also removed an unused variable and some unused imports.
Files Changed
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/TabInfoImpl.java