Description
The overlayed states are touched when beginning an update, but when an update is cancelled they are never untouched again. A subsequent external change to the same state is not merged correctly because the item will not appear stale.
The problem causes data inconsistencies in the following example scenario:
remote.getNode("/test").addNode("a");
remote.save();
local.getNode("/test").addNode("b");
local.save();
local.getNode("/test").getNode("a").addNode("c");
local.save();
remote.getNode("/test").getNode("a").remove();
final Node d = local.getNode("/test").addNode("d");
try {
remote.save(); // fails, but cancelling update leaves SISM in bad state
} catch (Exception e) {
remote.refresh(false);
}
remote.getNode("/test").addNode("e");
local.save();
remote.save(); // succeeds but leaves repository inconsistencies