[ 
https://issues.apache.org/jira/browse/CONFIGURATION-390?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12759991#action_12759991
 ] 

Ralph Goers commented on CONFIGURATION-390:
-------------------------------------------

I was able to get my test to pass by synchronizing the public methods.  This 
gets even more interesting because of SubnodeConfiguration objects.

I'm beginning to think that AbstractHierarchicalFileConfiguration, 
CombinedConfiguration and SubnodeConfiguration all need to extend a new class 
named HierarchicalReloadableConfiguration. This class would provide the reload 
lock object (or set it to the lock provided by the parent) and then lock all 
the appropriate methods. Subclasses wouldn't then have to provide overrides for 
all the methods and would be able to lock with the appropriate lock when they 
do override methods.

> AbstractHierarchicalFileConfiguration is not thread safe
> --------------------------------------------------------
>
>                 Key: CONFIGURATION-390
>                 URL: https://issues.apache.org/jira/browse/CONFIGURATION-390
>             Project: Commons Configuration
>          Issue Type: Bug
>          Components: File reloading
>    Affects Versions: 1.6
>            Reporter: Emmanuel Bourg
>             Fix For: 1.7
>
>         Attachments: commons-configuration-390.patch, configtest.tar.gz, 
> TestSuite.txt
>
>
> AbstractHierarchicalFileConfiguration doesn't implement the same locking 
> mechanism found in AbstractFileConfiguration. The consequence is that getting 
> a property while the configuration is being reloaded by another thread can 
> return an invalid result.
> This can be demonstrated by changing testDeadlockWithReload() in 
> TestCombinedConfiguration to use an XMLConfiguration instead of a 
> PropertiesConfiguration.
> Here is a reduced test case:
> {code:java}
> public void testConcurrentGetAndReload() throws Exception
> {
>     //final FileConfiguration config = new 
> PropertiesConfiguration("test.properties");
>     final FileConfiguration config = new XMLConfiguration("test.xml");
>     config.setReloadingStrategy(new FileAlwaysReloadingStrategy());
>     assertTrue("Property not found", config.getProperty("test.short") != 
> null);
>     new Thread()
>     {
>         public void run()
>         {
>             for (int i = 0; i < 1000; i++)
>             {
>                 config.reload();
>             }
>         }
>     }.start();
>     
>     for (int i = 0; i < 1000; i++)
>     {
>         assertTrue("Property not found", config.getProperty("test.short") != 
> null); // failure here
>     }
> }
> {code}
> The test doesn't always fail. It does about 50% of the time.

-- 
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