[MAGNOLIA-5759] Activation fails on uuid conflicts of sub-nodes Created: 30/Apr/14  Updated: 07/May/14  Resolved: 01/May/14

Status: Closed
Project: Magnolia
Component/s: activation
Affects Version/s: 5.2.4
Fix Version/s: 5.2.5

Type: Bug Priority: Critical
Reporter: Christian Ringele Assignee: Milan Divilek
Resolution: Fixed Votes: 0
Labels: support
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
causality
caused by MAGNOLIA-5734 Restoring previous page versions not ... Closed
Template:
Acceptance criteria:
Empty
Task DoD:
[ ]* Doc/release notes changes? Comment present?
[ ]* Downstream builds green?
[ ]* Solution information and context easily available?
[ ]* Tests
[ ]* FixVersion filled and not yet released
[ ]  Architecture Decision Record (ADR)
Bug DoR:
[ ]* Steps to reproduce, expected, and actual results filled
[ ]* Affected version filled
Date of First Response:

 Description   

Tested on 5.2.3 and 5.2.4. On 5.2.3 it worked properly as expected.
This problem happens on asynchronous and not-asynchronous activation.
It happens on workflow based and on direct activation (Tools -> JCR app). So it is a general activation problem and not just a problem of the asynchronous activation.

When a sub-node of a page (area node) has on the author a different UUID than on the public, the activation is fails with this error:

2014-04-30 14:15:54,182 ERROR dule.exchangetransactional.TransactionalSyndicator: Failed to activate content.
info.magnolia.cms.exchange.ExchangeException: Message received from subscriber: Activation failed : Node with the same UUID exists:node /test/sub1/metaNavigation
	at info.magnolia.module.activation.BaseSyndicatorImpl.activate(BaseSyndicatorImpl.java:426)
	at info.magnolia.module.exchangetransactional.TransactionalSyndicator$2.run(TransactionalSyndicator.java:181)
	at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Thread.java:695)
2014-04-30 14:15:54,185 ERROR dule.exchangetransactional.TransactionalSyndicator: Message received from subscriber: Activation failed : Node with the same UUID exists:node /test/sub1/metaNavigation
info.magnolia.cms.exchange.ExchangeException: Message received from subscriber: Activation failed : Node with the same UUID exists:node /test/sub1/metaNavigation
	at info.magnolia.module.activation.BaseSyndicatorImpl.activate(BaseSyndicatorImpl.java:426)
	at info.magnolia.module.exchangetransactional.TransactionalSyndicator$2.run(TransactionalSyndicator.java:181)
	at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Thread.java:695)

Valid use case where this happens:
as area nodes get created on first rendering, it might happen that a page is created on the author & public instance without the area nodes. The the pages get rendered on both instances, so the area nodes have a different UUID.
This happens on:

  • automated imports
  • migrations
  • creation of a page and then directly activate it
  • any manual change direct on the public
  • Any component that creates sub nodes dynamically on first render.

How to reproduce:

  • Create a page in pages app, don't render/open it
  • Activate it
  • render the page on the author (area nodes get created)
  • render the page on the public (area nodes get created)
  • try to activate the page again -> error


 Comments   
Comment by Daniel Lipp [ 30/Apr/14 ]

first suspicion was that it's related to new mgnlactivation 5.2.4: but testing a 5.2.4 bundle with mgnlactivation still showed the prob. So the issue is somewhere else...

Comment by Christian Ringele [ 30/Apr/14 ]

Now I got the full stakc trace:

2014-04-30 16:20:30,515 ERROR info.magnolia.module.activation.ReceiveFilter     : Exception caught
javax.jcr.ItemExistsException: Node with the same UUID exists:node /test/sub3/sub11/metaNavigation
	at org.apache.jackrabbit.core.xml.SessionImporter.startNode(SessionImporter.java:380)
	at org.apache.jackrabbit.core.xml.SysViewImportHandler.processNode(SysViewImportHandler.java:93)
	at org.apache.jackrabbit.core.xml.SysViewImportHandler.endElement(SysViewImportHandler.java:248)
	at org.apache.jackrabbit.core.xml.ImportHandler.endElement(ImportHandler.java:195)
	at org.apache.jackrabbit.commons.xml.DefaultContentHandler.endElement(DefaultContentHandler.java:83)
	at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
	at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
	at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
	at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at org.apache.xerces.jaxp.SAXParserImpl.parse(Unknown Source)
	at org.apache.jackrabbit.commons.xml.ParsingContentHandler.parse(ParsingContentHandler.java:62)
	at org.apache.jackrabbit.commons.AbstractSession.importXML(AbstractSession.java:344)
	at info.magnolia.jcr.wrapper.DelegateSessionWrapper.importXML(DelegateSessionWrapper.java:247)
	at info.magnolia.jcr.wrapper.DelegateSessionWrapper.importXML(DelegateSessionWrapper.java:247)
	at info.magnolia.module.activation.ReceiveFilter.importResource(ReceiveFilter.java:630)
	at info.magnolia.module.activation.ReceiveFilter.importOnExisting(ReceiveFilter.java:573)
	at info.magnolia.module.exchangetransactional.XAReceiveFilter.update(XAReceiveFilter.java:205)
	at info.magnolia.module.exchangetransactional.XAReceiveFilter.receive(XAReceiveFilter.java:146)
	at info.magnolia.module.activation.ReceiveFilter.doFilter(ReceiveFilter.java:178)
	at info.magnolia.module.exchangetransactional.XAReceiveFilter.doFilter(XAReceiveFilter.java:100)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:89)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:80)
	at info.magnolia.cms.security.auth.login.LoginFilter.doFilter(LoginFilter.java:104)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:89)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:80)
	at info.magnolia.enterprise.registration.RegistrationFilter.doFilter(RegistrationFilter.java:56)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:89)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:80)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:82)
	at info.magnolia.cms.filters.CosMultipartRequestFilter.doFilter(CosMultipartRequestFilter.java:89)
	at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:58)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:80)
	at info.magnolia.module.devicedetection.filter.DeviceDetectionFilter.doFilter(DeviceDetectionFilter.java:71)
	at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:58)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:80)
	at info.magnolia.cms.filters.ContentTypeFilter.doFilter(ContentTypeFilter.java:103)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:89)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:80)
	at info.magnolia.cms.filters.ContextFilter.doFilter(ContextFilter.java:129)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:89)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:80)
	at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:65)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:89)
	at info.magnolia.cms.filters.SafeDestroyMgnlFilterWrapper.doFilter(SafeDestroyMgnlFilterWrapper.java:106)
	at info.magnolia.cms.filters.MgnlFilterDispatcher.doDispatch(MgnlFilterDispatcher.java:66)
	at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:107)
	at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:93)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
	at java.lang.Thread.run(Thread.java:695)
Comment by Christian Ringele [ 30/Apr/14 ]

Seems as its triggered on line 630 in class info.magnolia.module.activation.ReceiveFilter:

hm.getWorkspace().getSession().importXML(parentPath, inputStream, ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING);

Checked JCR version in use between 5.2.3 and 5.2.4 -> same version: jackrabbit-jcr-commons-2.6.4.jar & jcr-2.0.jar

Comment by Christian Ringele [ 30/Apr/14 ]

Checked the UUID of the Node which it complains about:
The UUID exists for sure only on the author instance. There is no Node on the Public instance with the same UUID.

The situation is as described above:
Same pages (same uuid), same sub-node name but different UUID.
Unlcear why JCR detects a UUID collision on line 377 of org.apache.jackrabbit.core.xml.SessionImporter

Comment by Jan Haderka [ 02/May/14 ]

While this is indeed a very serious issue, it is at the same time also very uncommon use case. Normally editors actually edit pages after they create them and before they publish them, and if not editors, then publisher surely does.

Generated at Mon Feb 12 04:08:07 CET 2024 using Jira 9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b.