[ 
https://issues.apache.org/jira/browse/DERBY-5632?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Knut Anders Hatlen updated DERBY-5632:
--------------------------------------

    Attachment: experimental-v2.diff

Attaching version 2 of the patch that removes the explicit synchronization on 
the conglomerate cache. The only difference from version 1 is the way it 
retrieves a handle to the current transaction from 
CacheableConglomerate.setIdentity(). Now it uses the nested transaction instead 
of the top-level user transaction if there is one.

I wasn't quite happy with the approach used to get the current transaction (see 
RAMAccessManager.getCurrentTransactionContext()) as it needed to make some 
assumptions on how different transaction context types are stacked. I think it 
should do the right thing, though.

Apart from that, I think the patch is an improvement, as it allows more 
concurrent access to the conglomerate cache. Whether or not it helps with the 
deadlock, or if it just makes it block on some other monitor, I don't know.
                
> Logical deadlock happened when freezing/unfreezing the database
> ---------------------------------------------------------------
>
>                 Key: DERBY-5632
>                 URL: https://issues.apache.org/jira/browse/DERBY-5632
>             Project: Derby
>          Issue Type: Bug
>          Components: Documentation, Services
>    Affects Versions: 10.8.2.2
>         Environment: Oracle M3000/Solaris 10
>            Reporter: Brett Bergquist
>              Labels: derby_triage10_10
>         Attachments: experimental-v1.diff, experimental-v2.diff, stack.txt
>
>
> Tried to make a quick database backup by freezing the database, performing a 
> ZFS snapshot, and then unfreezing the database.   The database was frozen but 
> then a connection to the database could not be established to unfreeze the 
> database.
> Looking at the stack trace of the network server, , I see 3 threads that are 
> trying to process a connection request.   Each of these is waiting on:
>                 at 
> org.apache.derby.impl.store.access.RAMAccessManager.conglomCacheFind(Unknown 
> Source)
>                 - waiting to lock <0xfffffffd3a7fcc68> (a 
> org.apache.derby.impl.services.cache.ConcurrentCache)
> That object is owned by:
>                 - locked <0xfffffffd3a7fcc68> (a 
> org.apache.derby.impl.services.cache.ConcurrentCache)
>                 at 
> org.apache.derby.impl.store.access.RAMTransaction.findExistingConglomerate(Unknown
>  Source)
>                 at 
> org.apache.derby.impl.store.access.RAMTransaction.openGroupFetchScan(Unknown 
> Source)
>                 at 
> org.apache.derby.impl.services.daemon.IndexStatisticsDaemonImpl.updateIndexStatsMinion(Unknown
>  Source)
>                 at 
> org.apache.derby.impl.services.daemon.IndexStatisticsDaemonImpl.runExplicitly(Unknown
>  Source)
>                 at 
> org.apache.derby.impl.sql.execute.AlterTableConstantAction.updateStatistics(Unknown
>  Source)
> which itself is waiting for the object:
>                 at java.lang.Object.wait(Native Method)
>                 - waiting on <0xfffffffd3ac1d608> (a 
> org.apache.derby.impl.store.raw.log.LogToFile)
>                 at java.lang.Object.wait(Object.java:485)
>                 at 
> org.apache.derby.impl.store.raw.log.LogToFile.flush(Unknown Source)
>                 - locked <0xfffffffd3ac1d608> (a 
> org.apache.derby.impl.store.raw.log.LogToFile)
>                 at 
> org.apache.derby.impl.store.raw.log.LogToFile.flush(Unknown Source)
>                 at 
> org.apache.derby.impl.store.raw.data.BaseDataFileFactory.flush(Unknown Source)
> So basically what I think is happening is that the database is frozen, the 
> statistics are being updated on another thread which has the 
> "org.apache.derby.impl.services.cache.ConcurrentCache" locked and then waits 
> for the LogToFile lock and the connecting threads are waiting to lock 
> "org.apache.derby.impl.services.cache.ConcurrentCache" to connect and these 
> are where the database is going to be unfrozen.    Not a deadlock as far as 
> the JVM is concerned but it will never leave this state either.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to