Michael Noack created CONFIGURATION-788:
-------------------------------------------

             Summary: AbstractHierarchicalFileConfiguration can lose data when 
#save() is interrupted by JVM abort/power failure
                 Key: CONFIGURATION-788
                 URL: https://issues.apache.org/jira/browse/CONFIGURATION-788
             Project: Commons Configuration
          Issue Type: Bug
          Components: File reloading
    Affects Versions: 1.10
         Environment: This occurs in any environment with any use of 
AbstractFileConfiguration#save(), AbstractFileConfiguration#save(URL) or 
AbstractFileConfiguration#save(File).
            Reporter: Michael Noack
         Attachments: 
0001-Implemented-keep-backup-feature-for-file-configurati.patch

When saving the current configuration, either using any of the #save() Methods 
or when setting a property while auto-save is enabled the method 
AbstractFileConfiguration#save(URL) effectively wipes the file content when 
opening the OutputStream.

If the JVM gets destroyed or the machine powered down before the new 
configuration has been serialized to the file an empty file remains with no 
configuration at all.

 

I've created a patch on top of the RELEASE_1_10_BRANCH which introduces a 
mitigation. The mitigation consists of a "keep backup" flag in 
AbstractFileConfiguration which, if set, creates a copy of the current 
configuration file before writing into it.

When a configuration exception occurs upon loading the configuration again the 
exception will be caught and loading of the backup is attempted first before 
rethrowing the exception when this fails as well.

To allow existing implementations to profit from this without touching all 
instances a global flag has been added to AbstractHierarchicalFileConfiguration 
which is then inherited by all future delegates added to any instance of 
AbstractHierarchicalFileConfiguration.

Four unit tests for this mitigation feature have been added to 
TestHierarchicalXMLConfiguration.

I've uploaded a repository with the commit to github: 
https://github.com/noamik/commons-configuration/tree/RELEASE_1_11_BRANCH



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to