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)