Hans-Peter Stoerr created JCRVLT-525:
----------------------------------------

             Summary: FSPackageRegistry: XML registry files can become corrupt
                 Key: JCRVLT-525
                 URL: https://issues.apache.org/jira/browse/JCRVLT-525
             Project: Jackrabbit FileVault
          Issue Type: Bug
    Affects Versions: 3.5.0
         Environment: Sling-Starter 12-SNAPSHOT with JDK 11 on MacOS
            Reporter: Hans-Peter Stoerr


When the FSPackageRegistry is updated, it can happen that the XML files become 
corrupt when they are updated. They are not truncated when they are rewritten, 
and if they become shorter, there are remnants of the old XML after the end of 
the newly written XML, so that there is a SAXParseException when they are read 
again (e.g. after restarting the server, see stacktrace below).

The problem is pretty simple: in 
org.apache.jackrabbit.vault.packaging.registry.impl.FSInstallState#save(java.nio.file.Path)
 the file is opened with StandardOpenOption.CREATE, but it needs 
StandardOpenOption.TRUNCATE_EXISTING, like this:
{code:java}
try (OutputStream out = Files.newOutputStream(file, StandardOpenOption.CREATE, 
StandardOpenOption.TRUNCATE_EXISTING)) { 
{code}
I'm worried a little that the best way to deal with those files would be to 
write the content to a temporary file, and replace the old one with the newly 
written one after that's been saved completely to disk. Otherwise they can 
become corrupted for other reasons, too, e.g. if the writing fails before it's 
completed.

I stumbled over this when I'm using the Sling Feature Launcher and apply to 
[org.apache.sling.jcr.packageinit|https://github.com/apache/sling-org-apache-sling-jcr-packageinit]
 triggered by 
[org.apache.sling.extension.content|https://github.com/apache/sling-org-apache-sling-feature-extension-content]
 to deploy content packages from the feature launcher.

By the way: the files become shorter that they originally contain a 
workspaceFilter section when they are initially written by 
org.apache.sling.jcr.packageinit , and that section disappears when the 
packages are updated when they are installed. That smells like a problem, but 
I'm not sure about that. I'll append a stacktrace of the point when they are 
written, too.

Log messages during restart with the stacktrace where the reading fails:
{code:java}
[INFO][INFO] Apache Sling Application Launcher[INFO] 
---------------------------------[INFO] Initializing...[INFO] Artifact 
Repositories: 
[jar:file:/Users/hps/dev/composum/composum-launch/feature/composumstarter/target/composum-launcher-feature-composumstarter-1.2.1-SNAPSHOT-oak_tar-launcher.jar!/lib][INFO]
 Assembling final feature model...[INFO][INFO] Assembling launcher...[Fatal 
Error] composum-platform-models-package-1.3.1-SNAPSHOT.xml:5:2: Content is not 
allowed in trailing section.[ERROR] Error while assembling launcher: 
Configuration file syntax error. java.io.IOException: Configuration file syntax 
error.
        at 
shaded.org.apache.jackrabbit.vault.packaging.registry.impl.FSInstallState.fromStream(FSInstallState.java:245)
        at 
shaded.org.apache.jackrabbit.vault.packaging.registry.impl.FSInstallState.fromFile(FSInstallState.java:173)
        at 
shaded.org.apache.jackrabbit.vault.packaging.registry.impl.FSPackageRegistry.loadPackageCache(FSPackageRegistry.java:604)
        at 
shaded.org.apache.jackrabbit.vault.packaging.registry.impl.FSPackageRegistry.<init>(FSPackageRegistry.java:127)
        at 
org.apache.sling.feature.extension.content.ContentHandler.buildExecutionPlan(ContentHandler.java:72)
        at 
org.apache.sling.feature.extension.content.ContentHandler.handle(ContentHandler.java:127)
        at 
org.apache.sling.feature.launcher.impl.FeatureProcessor.prepareLauncher(FeatureProcessor.java:212)
        at 
org.apache.sling.feature.launcher.impl.Bootstrap.run(Bootstrap.java:160)
        at org.apache.sling.feature.launcher.impl.Main.main(Main.java:200)
        at 
com.composum.platform.feature.nodesstarter.LaunchFromEmbeddedFAR.run(LaunchFromEmbeddedFAR.java:65)
        at 
com.composum.platform.feature.nodesstarter.LaunchFromEmbeddedFAR.main(LaunchFromEmbeddedFAR.java:55)
Caused by: org.xml.sax.SAXParseException; systemId: 
file:///Users/hps/dev/composum/composum-launch/feature/composumstarter/target/launcher/repository/packageregistry/com/composum/platform/composum-platform-models-package-1.3.1-SNAPSHOT.xml;
 lineNumber: 5; columnNumber: 2; Content is not allowed in trailing section.
        at 
java.xml/com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:261)
        at 
java.xml/com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
        at 
java.xml/javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:151)
        at 
shaded.org.apache.jackrabbit.vault.packaging.registry.impl.FSInstallState.fromStream(FSInstallState.java:193)
        ... 10 more
{code}
Stacktrace where the files are written (and corrupted):
{code:java}
put:198, FSInstallStateCache 
(org.apache.jackrabbit.vault.packaging.registry.impl)
updatePackageStatus:166, FSInstallStateCache 
(org.apache.jackrabbit.vault.packaging.registry.impl)
installPackage:627, FSPackageRegistry 
(org.apache.jackrabbit.vault.packaging.registry.impl)
doInstall:193, PackageTaskImpl 
(org.apache.jackrabbit.vault.packaging.registry.impl)
execute:118, PackageTaskImpl 
(org.apache.jackrabbit.vault.packaging.registry.impl)
execute:129, ExecutionPlanImpl 
(org.apache.jackrabbit.vault.packaging.registry.impl)
execute:344, ExecutionPlanBuilderImpl 
(org.apache.jackrabbit.vault.packaging.registry.impl)
processRepository:165, ExecutionPlanRepoInitializer 
(org.apache.sling.jcr.packageinit.impl)
addingService:473, AbstractSlingRepositoryManager$2 (org.apache.sling.jcr.base)
addingService:462, AbstractSlingRepositoryManager$2 (org.apache.sling.jcr.base)
customizerAdding:943, ServiceTracker$Tracked (org.osgi.util.tracker)
customizerAdding:871, ServiceTracker$Tracked (org.osgi.util.tracker)
trackAdding:256, AbstractTracked (org.osgi.util.tracker)
track:229, AbstractTracked (org.osgi.util.tracker)
serviceChanged:903, ServiceTracker$Tracked (org.osgi.util.tracker)
invokeServiceListenerCallback:990, EventDispatcher (org.apache.felix.framework)
fireEventImmediately:838, EventDispatcher (org.apache.felix.framework)
fireServiceEvent:545, EventDispatcher (org.apache.felix.framework)
fireServiceEvent:4833, Felix (org.apache.felix.framework)
registerService:3804, Felix (org.apache.felix.framework)
registerService:328, BundleContextImpl (org.apache.felix.framework)
register:929, AbstractComponentManager$3 (org.apache.felix.scr.impl.manager)
register:915, AbstractComponentManager$3 (org.apache.felix.scr.impl.manager)
changeRegistration:133, RegistrationManager (org.apache.felix.scr.impl.manager)
registerService:984, AbstractComponentManager 
(org.apache.felix.scr.impl.manager)
activateInternal:752, AbstractComponentManager 
(org.apache.felix.scr.impl.manager)
enableInternal:674, AbstractComponentManager (org.apache.felix.scr.impl.manager)
enable:437, AbstractComponentManager (org.apache.felix.scr.impl.manager)
enableComponents:667, ConfigurableComponentHolder 
(org.apache.felix.scr.impl.manager)
initialEnable:305, BundleComponentActivator (org.apache.felix.scr.impl)
loadComponents:554, Activator (org.apache.felix.scr.impl)
access$200:70, Activator (org.apache.felix.scr.impl)
start:421, Activator$ScrExtension (org.apache.felix.scr.impl)
createExtension:196, AbstractExtender (org.apache.felix.scr.impl)
modifiedBundle:169, AbstractExtender (org.apache.felix.scr.impl)
modifiedBundle:49, AbstractExtender (org.apache.felix.scr.impl)
customizerModified:488, BundleTracker$Tracked (org.osgi.util.tracker)
customizerModified:420, BundleTracker$Tracked (org.osgi.util.tracker)
track:232, AbstractTracked (org.osgi.util.tracker)
bundleChanged:450, BundleTracker$Tracked (org.osgi.util.tracker)
invokeBundleListenerCallback:915, EventDispatcher (org.apache.felix.framework)
fireEventImmediately:834, EventDispatcher (org.apache.felix.framework)
fireBundleEvent:516, EventDispatcher (org.apache.felix.framework)
fireBundleEvent:4817, Felix (org.apache.felix.framework)
startBundle:2336, Felix (org.apache.felix.framework)
setActiveStartLevel:1539, Felix (org.apache.felix.framework)
run:308, FrameworkStartLevelImpl (org.apache.felix.framework)
run:834, Thread (java.lang)
{code}



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

Reply via email to