db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Knut Anders Hatlen (JIRA)" <j...@apache.org>
Subject [jira] Commented: (DERBY-4711) Hung thread after another thread is interrupted
Date Sat, 26 Jun 2010 18:07:49 GMT

    [ https://issues.apache.org/jira/browse/DERBY-4711?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12882872#action_12882872
] 

Knut Anders Hatlen commented on DERBY-4711:
-------------------------------------------

Hi Mike,

I've added this comment along with the fix in LockSet and ConcurrentLockSet:

+                        // DERBY-4711: If waitForGrant() fails, we need to
+                        // remove ourselves from the queue so that those
+                        // behind us in the queue don't get stuck waiting for
+                        // us.

The problem is that (Concurrent)LockSet.lockObject() only removes the waiter from the queue
if the lock is obtained or if a timeout/deadlock exception is generated (using similar code
further down in said method). When waitForGrant() fails (in this case with a StandardException
wrapping an InterruptedException), it is not removed from the queue, and other threads are
blocked by a lock request that's no longer alive. The fix removes the failed waiter from the
queue, and allows the other threads to proceed.

Hope this made things clearer.

> Hung thread after another thread is interrupted
> -----------------------------------------------
>
>                 Key: DERBY-4711
>                 URL: https://issues.apache.org/jira/browse/DERBY-4711
>             Project: Derby
>          Issue Type: Bug
>          Components: Services
>    Affects Versions: 10.5.3.0
>         Environment: Windows server 2008
>            Reporter: Luke Quinane
>            Assignee: Luke Quinane
>             Fix For: 10.7.0.0
>
>         Attachments: interrupted-exception-fix.diff, interrupted-exception-fix.patch,
junit.diff
>
>
> We've seen a problem today where we have several threads querying our database and when
one gets interrupted the others are stuck waiting for a lock. Here is the stack trace for
the stuck thread(s):
> daemon prio=4
> "DefaultExecutorService-pool-1-thread-47" Id=98 WAITING on org.apache.derby.impl.services.locks.ActiveLock@6e6f45a1
> 	at java.lang.Object.wait(Native Method)
> 	-  waiting on org.apache.derby.impl.services.locks.ActiveLock@6e6f45a1
> 	at java.lang.Object.wait(Object.java:485)
> 	at org.apache.derby.impl.services.locks.ActiveLock.waitForGrant(ActiveLock.java:115)
> 	at org.apache.derby.impl.services.locks.ConcurrentLockSet.lockObject(ConcurrentLockSet.java:463)
> 	at org.apache.derby.impl.services.locks.ConcurrentLockSet.zeroDurationLockObject(ConcurrentLockSet.java:855)
> 	at org.apache.derby.impl.services.locks.AbstractPool.zeroDurationlockObject(AbstractPool.java:297)
> 	at org.apache.derby.impl.services.locks.ConcurrentPool.zeroDurationlockObject(ConcurrentPool.java:28)
> 	at org.apache.derby.impl.store.raw.xact.RowLocking2nohold.lockRecordForRead(RowLocking2nohold.java:89)
> 	at org.apache.derby.impl.store.access.heap.HeapController.lockRow(HeapController.java:520)
> 	at org.apache.derby.impl.store.access.heap.HeapController.lockRow(HeapController.java:638)
> 	at org.apache.derby.impl.store.access.btree.index.B2IRowLocking3.lockRowOnPage(B2IRowLocking3.java:309)
> 	at org.apache.derby.impl.store.access.btree.index.B2IRowLocking3._lockScanRow(B2IRowLocking3.java:599)
> 	at org.apache.derby.impl.store.access.btree.index.B2IRowLockingRR.lockScanRow(B2IRowLockingRR.java:105)
> 	at org.apache.derby.impl.store.access.btree.BTreeForwardScan.fetchRows(BTreeForwardScan.java:305)
> 	at org.apache.derby.impl.store.access.btree.BTreeScan.fetchNextGroup(BTreeScan.java:1585)
> 	at org.apache.derby.impl.sql.execute.BulkTableScanResultSet.reloadArray(BulkTableScanResultSet.java:327)
> 	at org.apache.derby.impl.sql.execute.BulkTableScanResultSet.getNextRowCore(BulkTableScanResultSet.java:282)
> 	at org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.getNextRow(BasicNoPutResultSetImpl.java:460)
> 	at org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(EmbedResultSet.java:427)
> 	-  locked org.apache.derby.impl.jdbc.EmbedConnection40@445d374b
> 	at org.apache.derby.impl.jdbc.EmbedResultSet.next(EmbedResultSet.java:371)
>         ...

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message