Current reloading process clears current properties and load updated values from
resource reader. If an IO error occurs (or invalid format), the configuration
gets corrupted and the application becomes unstable.
It may be better for hot-reload to put loaded values into a temporary Properties
and replace previous values only when reloading is successful.
It may also allow to use a 'currentlty-reloading' flag in the synchronized
'reload' block to avoid blocking threads during a reload (they could access
safelly the 'old' properties until reload is finished)
fixed by changing the reload() method in AbstractFileConfiguration, it may look
like this :
public void reload()
{
synchronized (reloadLock)
{
if (noReload == 0 && strategy.reloadingRequired())
{
// save the properties
Map previousProperties = new LinkedMap(store);
try
{ clear(); load(); // notify the strategy strategy.reloadingPerformed(); }catch (Exception e)
{ e.printStackTrace(); // rollback the changes store = previousProperties; }}
}
}
I'm not sure it's the best way to rollback the changes though, copying the
properties seems expensive. Any idea ? Should we add a safeReload flag to
enable/disable this feature ?