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

Kristian Waagan updated DERBY-4928:
-----------------------------------

    Attachment: derby-4928-1a-depman_sync_and_cleanup.diff

Attaching patch 1a.

This patch primarily addresses incorrect synchronization in 
BasicDependencyManager. The rule was already described in the class, but the 
implementation didn't obey them:
 o use synchronized (this) when accessing in-memory dependencies (deps stored 
in BasicDependencyManager)
 o don't use synchronized (this) when accessing stored dependencies, but rely 
on database locking (deps stored in the data dictionary / a system table)

I haven't come across cases where we need to synchronize over both sets of 
dependencies (at the same time).

Main changes in BasicDependecyManager:
 o split body of addDepencendy into addInMemoryDependency and 
addStoredDependency
 o corrected JavaDoc for coreInvalidateFor (the flag 'forSync' doesn't exist)
 o fixed synchronization in clearDependencies (this is where the automatic 
index stats update feature got stuck in a deadlock)
 o reformatted (+tiny refactoring) clearInMemoryDependencies
 o deleted commented out methods getAllProviders and getAllProvidersInfos
 o removed synchronized for getPersistentProvidersInfos and rewrote method
 o removed synchronized for copyDependencies
 o fixed synchronization in countDependencies
 o deleted unused method dumpDependencies (and then bubbleSort)
 o rewrote methods getProviders and getDependents for new sync rules
 o replaced HashTable with Map
 o removed methods newSList

Changes in ViewsTest and BaseJDBCTestCase:
 o added method assertStatementErrorUnordered, as the ordering of in-memory and 
stored dependencies changed to to the changes described above (this can easily 
be switched back, but I don't see why - decided to make the test more resilient 
to varying ordering instead).
 o used the new assert method were the test failed


Re-running regression tests.
Patch ready for review.

> Deadlock-prone synchronization in BasicDependencyManager
> --------------------------------------------------------
>
>                 Key: DERBY-4928
>                 URL: https://issues.apache.org/jira/browse/DERBY-4928
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.8.0.0
>            Reporter: Kristian Waagan
>            Assignee: Kristian Waagan
>         Attachments: derby-4928-1a-depman_sync_and_cleanup.diff
>
>
> The synchronization in BasicDependencyManager is prone to deadlock, because 
> database locks are obtained while holding the monitor on "this".
> Problem observed when testing the automatic index statistics update prototype.
> There are comments in the file suggesting that in-memory dependencies should 
> be accessed while holding the Java monitor, but the monitor should not be 
> held when accessing stored dependencies. The implementation is breaking this 
> rule/suggestion.

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

Reply via email to