Uploaded image for project: 'XWiki Platform'
  1. XWiki Platform
  2. XWIKI-23082

XWikiDocument dirty flag is updated when loading an attachment content from the hibernate store

    XMLWordPrintable

Details

    • Bug
    • Resolution: Fixed
    • Major
    • 16.10.6, 17.3.0-rc-1, 17.2.1
    • 16.10.5
    • Old Core
    • Windows 11 Pro, Firefox 137, using an instance of XWiki 17.2.0 on MySQL 9, Tomcat 11.0.5
    • Unknown
    • N/A
    • N/A

    Description

      Steps to reproduce

      1. Create an older instance of XWiki (I've used for this test XWiki 11.10.13 on MySQL 9.0/ Tomcat 9.0.102)
      2. Upgrade this instance to XWiki 17.2.0 by replacing the old WAR with the new one (and using a newer Tomcat version, I've tested with Tomcat 11.0.5)
      3. Start the instance and follow the Distribution Wizard
      4. Observe the logs (both from console and from the browser)

      Expected results

      No warnings are displayed in the logs.

      Actual results

      The following warnings are displayed in console:

      2025-04-08 15:24:57,517 [XWiki initialization] WARN  c.x.x.d.XWikiDocument          - Abusive modification of the cached document [xwiki:Templates.Article.Template.WebHome()]
      java.lang.IllegalStateException: Abusive modification of the cached document
              at com.xpn.xwiki.doc.XWikiDocument.setMetaDataDirty(XWikiDocument.java:2457)
              at com.xpn.xwiki.doc.XWikiAttachmentContent.setContentDirty(XWikiAttachmentContent.java:233)
              at com.xpn.xwiki.doc.XWikiAttachmentContent$1.close(XWikiAttachmentContent.java:292)
              at com.xpn.xwiki.doc.XWikiAttachmentContent.setContent(XWikiAttachmentContent.java:326)
              at com.xpn.xwiki.doc.XWikiAttachmentContent.setContent(XWikiAttachmentContent.java:187)
              at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
              at java.base/java.lang.reflect.Method.invoke(Method.java:580)
              at org.hibernate.property.access.spi.SetterMethodImpl.set(SetterMethodImpl.java:45)
              at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:694)
              at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:144)
              at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:5281)
              at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntityFromEntityEntryLoadedState(TwoPhaseLoad.java:253)
              at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:156)
              at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:126)
              at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.performTwoPhaseLoad(AbstractRowReader.java:221)
              at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishUp(AbstractRowReader.java:187)
              at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:96)
              at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:105)
              at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:285)
              at org.hibernate.persister.entity.AbstractEntityPersister.doLoad(AbstractEntityPersister.java:4550)
              at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4540)
              at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:571)
              at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:539)
              at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:208)
              at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:327)
              at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108)
              at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74)
              at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:118)
              at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1231)
              at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1220)
              at org.hibernate.internal.SessionImpl.load(SessionImpl.java:996)
              at org.hibernate.engine.spi.SessionDelegatorBaseImpl.load(SessionDelegatorBaseImpl.java:820)
              at com.xpn.xwiki.store.XWikiHibernateAttachmentStore.lambda$loadAttachmentContent$0(XWikiHibernateAttachmentStore.java:241)
              at com.xpn.xwiki.store.XWikiHibernateBaseStore.execute(XWikiHibernateBaseStore.java:851)
              at com.xpn.xwiki.store.XWikiHibernateBaseStore.executeRead(XWikiHibernateBaseStore.java:927)
              at com.xpn.xwiki.store.XWikiHibernateAttachmentStore.loadAttachmentContent(XWikiHibernateAttachmentStore.java:238)
              at com.xpn.xwiki.doc.XWikiAttachment.loadAttachmentContent(XWikiAttachment.java:1105)
              at com.xpn.xwiki.doc.XWikiAttachment.reloadAttachmentContent(XWikiAttachment.java:929)
              at com.xpn.xwiki.doc.XWikiAttachment.getContentInputStream(XWikiAttachment.java:907)
              at org.xwiki.extension.xar.internal.job.diff.AttachmentUnifiedDiffBuilder.contentEquals(AttachmentUnifiedDiffBuilder.java:131)
              at org.xwiki.extension.xar.internal.job.diff.AttachmentUnifiedDiffBuilder.addAttachmentDiff(AttachmentUnifiedDiffBuilder.java:90)
              at org.xwiki.extension.xar.internal.job.diff.DocumentUnifiedDiffBuilder.addAttachmentDiffs(DocumentUnifiedDiffBuilder.java:155)
              at org.xwiki.extension.xar.internal.job.diff.DocumentUnifiedDiffBuilder.diff(DocumentUnifiedDiffBuilder.java:89)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentCustomizationDetector.isCustomized(InstalledExtensionDocumentCustomizationDetector.java:95)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentCustomizationDetector.lambda$isCustomized$0(InstalledExtensionDocumentCustomizationDetector.java:86)
              at java.base/java.util.stream.MatchOps$1MatchSink.accept(MatchOps.java:90)
              at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1685)
              at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
              at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
              at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
              at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
              at java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230)
              at java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196)
              at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
              at java.base/java.util.stream.ReferencePipeline.allMatch(ReferencePipeline.java:637)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentCustomizationDetector.isCustomized(InstalledExtensionDocumentCustomizationDetector.java:86)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentListener.updateCustomizedFlag(InstalledExtensionDocumentListener.java:132)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentListener.addExtensionDocument(InstalledExtensionDocumentListener.java:153)
              at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1715)
              at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentListener.forEachExtensionDocument(InstalledExtensionDocumentListener.java:166)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentListener.addExtensionDocuments(InstalledExtensionDocumentListener.java:147)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentListener.lambda$addExtensionDocuments$1(InstalledExtensionDocumentListener.java:140)
              at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)
              at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentListener.addExtensionDocuments(InstalledExtensionDocumentListener.java:140)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentListener.onEvent(InstalledExtensionDocumentListener.java:115)
              at org.xwiki.observation.internal.DefaultObservationManager.notify(DefaultObservationManager.java:338)
              at org.xwiki.observation.internal.DefaultObservationManager.notify(DefaultObservationManager.java:303)
              at com.xpn.xwiki.internal.XWikiInitializerJob.runInternal(XWikiInitializerJob.java:117)
              at org.xwiki.job.AbstractJob.runInContext(AbstractJob.java:246)
              at org.xwiki.job.AbstractJob.run(AbstractJob.java:223)
              at java.base/java.lang.Thread.run(Thread.java:1583)
      2025-04-08 15:24:57,743 [XWiki initialization] WARN  c.x.x.d.XWikiDocument          - Abusive modification of the cached document [xwiki:Templates.Encyclopedia.Template.WebHome()]
      java.lang.IllegalStateException: Abusive modification of the cached document
              at com.xpn.xwiki.doc.XWikiDocument.setMetaDataDirty(XWikiDocument.java:2457)
              at com.xpn.xwiki.doc.XWikiAttachmentContent.setContentDirty(XWikiAttachmentContent.java:233)
              at com.xpn.xwiki.doc.XWikiAttachmentContent$1.close(XWikiAttachmentContent.java:292)
              at com.xpn.xwiki.doc.XWikiAttachmentContent.setContent(XWikiAttachmentContent.java:326)
              at com.xpn.xwiki.doc.XWikiAttachmentContent.setContent(XWikiAttachmentContent.java:187)
              at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
              at java.base/java.lang.reflect.Method.invoke(Method.java:580)
              at org.hibernate.property.access.spi.SetterMethodImpl.set(SetterMethodImpl.java:45)
              at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:694)
              at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:144)
              at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:5281)
              at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntityFromEntityEntryLoadedState(TwoPhaseLoad.java:253)
              at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:156)
              at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:126)
              at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.performTwoPhaseLoad(AbstractRowReader.java:221)
              at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishUp(AbstractRowReader.java:187)
              at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:96)
              at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:105)
              at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:285)
              at org.hibernate.persister.entity.AbstractEntityPersister.doLoad(AbstractEntityPersister.java:4550)
              at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4540)
              at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:571)
              at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:539)
              at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:208)
              at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:327)
              at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108)
              at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74)
              at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:118)
              at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1231)
              at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1220)
              at org.hibernate.internal.SessionImpl.load(SessionImpl.java:996)
              at org.hibernate.engine.spi.SessionDelegatorBaseImpl.load(SessionDelegatorBaseImpl.java:820)
              at com.xpn.xwiki.store.XWikiHibernateAttachmentStore.lambda$loadAttachmentContent$0(XWikiHibernateAttachmentStore.java:241)
              at com.xpn.xwiki.store.XWikiHibernateBaseStore.execute(XWikiHibernateBaseStore.java:851)
              at com.xpn.xwiki.store.XWikiHibernateBaseStore.executeRead(XWikiHibernateBaseStore.java:927)
              at com.xpn.xwiki.store.XWikiHibernateAttachmentStore.loadAttachmentContent(XWikiHibernateAttachmentStore.java:238)
              at com.xpn.xwiki.doc.XWikiAttachment.loadAttachmentContent(XWikiAttachment.java:1105)
              at com.xpn.xwiki.doc.XWikiAttachment.reloadAttachmentContent(XWikiAttachment.java:929)
              at com.xpn.xwiki.doc.XWikiAttachment.getContentInputStream(XWikiAttachment.java:907)
              at org.xwiki.extension.xar.internal.job.diff.AttachmentUnifiedDiffBuilder.contentEquals(AttachmentUnifiedDiffBuilder.java:131)
              at org.xwiki.extension.xar.internal.job.diff.AttachmentUnifiedDiffBuilder.addAttachmentDiff(AttachmentUnifiedDiffBuilder.java:90)
              at org.xwiki.extension.xar.internal.job.diff.DocumentUnifiedDiffBuilder.addAttachmentDiffs(DocumentUnifiedDiffBuilder.java:155)
              at org.xwiki.extension.xar.internal.job.diff.DocumentUnifiedDiffBuilder.diff(DocumentUnifiedDiffBuilder.java:89)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentCustomizationDetector.isCustomized(InstalledExtensionDocumentCustomizationDetector.java:95)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentCustomizationDetector.lambda$isCustomized$0(InstalledExtensionDocumentCustomizationDetector.java:86)
              at java.base/java.util.stream.MatchOps$1MatchSink.accept(MatchOps.java:90)
              at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1685)
              at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
              at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
              at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
              at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
              at java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230)
              at java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196)
              at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
              at java.base/java.util.stream.ReferencePipeline.allMatch(ReferencePipeline.java:637)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentCustomizationDetector.isCustomized(InstalledExtensionDocumentCustomizationDetector.java:86)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentListener.updateCustomizedFlag(InstalledExtensionDocumentListener.java:132)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentListener.addExtensionDocument(InstalledExtensionDocumentListener.java:153)
              at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1715)
              at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentListener.forEachExtensionDocument(InstalledExtensionDocumentListener.java:166)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentListener.addExtensionDocuments(InstalledExtensionDocumentListener.java:147)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentListener.lambda$addExtensionDocuments$1(InstalledExtensionDocumentListener.java:140)
              at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)
              at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentListener.addExtensionDocuments(InstalledExtensionDocumentListener.java:140)
              at org.xwiki.extension.xar.internal.doc.InstalledExtensionDocumentListener.onEvent(InstalledExtensionDocumentListener.java:115)
              at org.xwiki.observation.internal.DefaultObservationManager.notify(DefaultObservationManager.java:338)
              at org.xwiki.observation.internal.DefaultObservationManager.notify(DefaultObservationManager.java:303)
              at com.xpn.xwiki.internal.XWikiInitializerJob.runInternal(XWikiInitializerJob.java:117)
              at org.xwiki.job.AbstractJob.runInContext(AbstractJob.java:246)
              at org.xwiki.job.AbstractJob.run(AbstractJob.java:223)
              at java.base/java.lang.Thread.run(Thread.java:1583)

      and there are also many warnings in the browser's DW:

      Abusive modification of the cached document
      class java.lang.IllegalStateException: Abusive modification of the cached document
          at com.xpn.xwiki.doc.XWikiDocument.setMetaDataDirty(XWikiDocument.java:2457)
          at com.xpn.xwiki.objects.BaseElement.setDirty(BaseElement.java:133)
          at com.xpn.xwiki.objects.BaseProperty.setDirty(BaseProperty.java:386)
          at com.xpn.xwiki.objects.BaseProperty.setValueDirty(BaseProperty.java:380)
          at com.xpn.xwiki.objects.BaseProperty.setValueDirty(BaseProperty.java:368)
          at com.xpn.xwiki.objects.NumberProperty.setValue(NumberProperty.java:54)
          at com.xpn.xwiki.objects.BaseProperty.apply(BaseProperty.java:342)
          at com.xpn.xwiki.objects.BaseCollection.apply(BaseCollection.java:971)
          at com.xpn.xwiki.doc.XWikiDocument.apply(XWikiDocument.java:9530)
          at com.xpn.xwiki.doc.XWikiDocument.apply(XWikiDocument.java:9430)
          at org.xwiki.extension.xar.internal.handler.packager.DocumentMergeImporter.saveDocument(DocumentMergeImporter.java:142)
          at org.xwiki.extension.xar.internal.handler.packager.DocumentMergeImporter.importDocument(DocumentMergeImporter.java:117)
          at org.xwiki.extension.xar.internal.handler.packager.Packager.importDocumentToWiki(Packager.java:230)
          at org.xwiki.extension.xar.internal.handler.packager.Packager.importXARToWiki(Packager.java:184)
          at org.xwiki.extension.xar.internal.handler.packager.Packager.importXARToWiki(Packager.java:157)
          at org.xwiki.extension.xar.internal.handler.packager.Packager.importXAR(Packager.java:148)
          at org.xwiki.extension.xar.internal.handler.XarExtensionHandler.installInternal(XarExtensionHandler.java:189)
          at org.xwiki.extension.xar.internal.handler.XarExtensionHandler.upgrade(XarExtensionHandler.java:169)
          at org.xwiki.extension.handler.internal.DefaultExtensionHandlerManager.upgrade(DefaultExtensionHandlerManager.java:139)
          at org.xwiki.extension.job.internal.AbstractExtensionJob.installExtension(AbstractExtensionJob.java:349)
          at org.xwiki.extension.job.internal.AbstractExtensionJob.applyAction(AbstractExtensionJob.java:233)
          at org.xwiki.extension.job.internal.AbstractExtensionJob.applyActions(AbstractExtensionJob.java:181)
          at org.xwiki.extension.job.internal.InstallJob.runInternal(InstallJob.java:140)
          at org.xwiki.job.AbstractJob.runInContext(AbstractJob.java:246)
          at org.xwiki.job.AbstractJob.run(AbstractJob.java:223)
          at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
          at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
          at java.base/java.lang.Thread.run(Thread.java:1583)
      

      Attachments

        Activity

          People

            tmortagne Thomas Mortagne
            iandriuta Ilie Andriuta
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: