[ 
https://issues.apache.org/jira/browse/JCRVLT-525?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Konrad Windszus closed JCRVLT-525.
----------------------------------

> 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
>            Assignee: Konrad Windszus
>            Priority: Major
>             Fix For: 3.5.4
>
>
> 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