Uploaded image for project: 'Confluence Cloud'
  1. Confluence Cloud
  2. CONFCLOUD-70913

Copying a page tree with restricted page with Copy Page Hierarchy API fails creating page properties

    XMLWordPrintable

Details

    Description

      Issue Summary

      Copying a page tree that contains a page restricted to edit by another user fails when creates page properties.

      Steps to Reproduce

      1. As User 1
        1. Create a new space named SRC with default permissions.
        2. Create a new blank page.
        3. Set page restrictions on the newly created page so that only User 1 can edit.
      2. As User 2:
        1. Create a new space named DEST with default permissions.
        2. Use the copy page hierarchy to copy the SRC home page to the DEST home page.
          1. Set copyAttachments, copyPermissions, copyProperties, copyLabels = true.
          2. Use a unique prefix (e.g. [TEST]).
        3. Poll the long task API.

      Request example:

      POST {{baseurl}}/rest/api/content/<source_home_id>/pagehierarchy/copy
      {
        "copyAttachments": true,
        "copyProperties": true,
        "copyLabels": true,
        "copyPermissions": true,
        "destinationPageId": "<destination_home_id>",
        "titleOptions": {
          "prefix": "[COPY] "
        }
      }
      

       

      Expected Results

      The long task percentageComplete eventually reaches 100

      Actual Results

      • The long task percentageComplete never reaches 100
      • The long task keeps advancing until some point, then resets to 0 and starts over
      • Errors in the logs appear a few minutes after the call (and repeating every few minutes after that):
         err: {
           class: [
             org.springframework.transaction.UnexpectedRollbackException
           ]
           stack: org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
      org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:871)
      org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:708)
      sun.reflect.GeneratedMethodAccessor86.invoke(Unknown Source)
      sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      java.lang.reflect.Method.invoke(Unknown Source)
      org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
      org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:205)
      com.sun.proxy.$Proxy74.commit(Unknown Source)
      org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:631)
      org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:385)
      org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      com.atlassian.spring.interceptors.SpringProfilingInterceptor.invoke(SpringProfilingInterceptor.java:16)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      cloud.atlassian.logmon.datadog.publisher.internal.DefaultFunctionalTimeRecorder.with(DefaultFunctionalTimeRecorder.java:24)
      com.atlassian.confluence.util.profiling.ConfluenceMonitoringMethodInterceptor.invoke(ConfluenceMonitoringMethodInterceptor.java:39)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
      com.sun.proxy.$Proxy254.deepCopy(Unknown Source)
      com.atlassian.confluence.api.impl.service.longtasks.BulkPageCopyTaskRunner.runTask(BulkPageCopyTaskRunner.java:178)
      com.atlassian.progress.amq.TaskProcessor.accept(TaskProcessor.java:63)
      com.atlassian.progress.amq.TaskProcessor.accept(TaskProcessor.java:23)
      com.atlassian.progress.amq.ConcurrencyControlTaskProcessor.accept(ConcurrencyControlTaskProcessor.java:68)
      com.atlassian.progress.amq.ConcurrencyControlTaskProcessor.accept(ConcurrencyControlTaskProcessor.java:19)
      com.atlassian.progress.amq.ProgressAwareMessageRunner.processMessage(ProgressAwareMessageRunner.java:55)
      com.atlassian.confluence.impl.messagequeue.VCacheMessageRunner.lambda$processMessage$0(VCacheMessageRunner.java:21)
      com.atlassian.confluence.vcache.VCacheRequestContextOperations.lambda$doInRequestContext$0(VCacheRequestContextOperations.java:49)
      com.atlassian.confluence.impl.vcache.VCacheRequestContextManager.doInRequestContext(VCacheRequestContextManager.java:84)
      com.atlassian.confluence.impl.vcache.VCacheRequestContextManager.doInRequestContext(VCacheRequestContextManager.java:74)
      com.atlassian.confluence.vcache.VCacheRequestContextOperations.doInRequestContext(VCacheRequestContextOperations.java:48)
      com.atlassian.confluence.impl.messagequeue.VCacheMessageRunner.processMessage(VCacheMessageRunner.java:20)
      com.atlassian.confluence.util.zipkin.impl.ZipkinMessageRunner.processMessage(ZipkinMessageRunner.java:31)
      com.atlassian.messagequeue.internal.core.NestedMessageConsumer.consume(NestedMessageConsumer.java:113)
      com.atlassian.messagequeue.internal.sqs.SQSMessageConsumer.consumeMessage(SQSMessageConsumer.java:248)
      com.atlassian.messagequeue.internal.sqs.SQSMessageConsumer.processReceiveMessageResult(SQSMessageConsumer.java:198)
      com.atlassian.messagequeue.internal.sqs.SQSMessageConsumer.run(SQSMessageConsumer.java:123)
      java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
      java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
      java.lang.Thread.run(Unknown Source)
         }
         level: ERROR
         logger: com.atlassian.confluence.api.impl.service.longtasks.BulkPageCopyTaskRunner
      
      
      
      
      
         err: {
           class: [
             com.atlassian.confluence.api.service.exceptions.PermissionException
           ]
           stack: com.atlassian.confluence.api.service.exceptions.PermissionException: Cannot create new content property, see https://docs.atlassian.com/confluence/REST/latest/#content/{id}/property-create for usage. Property : JsonContentProperty{id='null', key='editor', content=ExpandedReference{idProperties={version=EmptyReference{referentClass=class com.atlassian.confluence.api.model.content.Version}, id=ContentId{id=447283324}, status=current}, of=some(Content{id='ContentId{id=447283324}', type=null, title='null', status=current, space=EmptyReference{referentClass=class com.atlassian.confluence.api.model.content.Space}, history=EmptyReference{referentClass=class com.atlassian.confluence.api.model.content.History}, version=EmptyReference{referentClass=class com.atlassian.confluence.api.model.content.Version}, ancestors=null (CollapsedList), container=EmptyReference{referentClass=interface com.atlassian.confluence.api.model.content.Container}, childTypes={}})}, version=null}
      com.atlassian.confluence.api.model.validation.SimpleValidationResult.lambda$static$0(SimpleValidationResult.java:31)
      com.atlassian.confluence.api.model.validation.SimpleValidationResult.convertToServiceException(SimpleValidationResult.java:70)
      com.atlassian.confluence.api.model.validation.ValidationResult.throwIfNotSuccessful(ValidationResult.java:184)
      com.atlassian.confluence.plugins.contentproperty.ContentPropertyServiceImpl.create(ContentPropertyServiceImpl.java:58)
      com.atlassian.confluence.plugins.contentproperty.caching.CachingContentPropertyServiceImpl.create(CachingContentPropertyServiceImpl.java:41)
      sun.reflect.GeneratedMethodAccessor1313.invoke(Unknown Source)
      sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      java.lang.reflect.Method.invoke(Unknown Source)
      org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
      org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
      com.atlassian.plugins.spring.interceptor.plugin.ExportableInterceptorAdapter$WrappedMethodInvocation.proceed(ExportableInterceptorAdapter.java:53)
      com.atlassian.plugins.spring.interceptor.spi.SpringInterceptorAdapter$SpringMethodInvocationAdapter.proceed(SpringInterceptorAdapter.java:50)
      org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)
      org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)
      com.atlassian.plugins.spring.interceptor.spi.SpringInterceptorAdapter.invoke(SpringInterceptorAdapter.java:23)
      sun.reflect.GeneratedMethodAccessor511.invoke(Unknown Source)
      sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      java.lang.reflect.Method.invoke(Unknown Source)
      com.atlassian.plugin.util.ContextClassLoaderSettingInvocationHandler.invoke(ContextClassLoaderSettingInvocationHandler.java:26)
      com.sun.proxy.$Proxy529.invoke(Unknown Source)
      com.atlassian.plugins.spring.interceptor.plugin.ExportableInterceptorAdapter.invoke(ExportableInterceptorAdapter.java:26)
      sun.reflect.GeneratedMethodAccessor510.invoke(Unknown Source)
      sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      java.lang.reflect.Method.invoke(Unknown Source)
      org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
      org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:56)
      org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:60)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:136)
      org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:124)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor$1.run(ServiceTCCLInterceptor.java:61)
      org.eclipse.gemini.blueprint.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:130)
      org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invokePrivileged(ServiceTCCLInterceptor.java:58)
      org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:50)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.eclipse.gemini.blueprint.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:57)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:136)
      org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:124)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
      com.sun.proxy.$Proxy1505.invoke(Unknown Source)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
      com.sun.proxy.$Proxy1593.create(Unknown Source)
      sun.reflect.GeneratedMethodAccessor1313.invoke(Unknown Source)
      sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      java.lang.reflect.Method.invoke(Unknown Source)
      com.atlassian.confluence.osgi.OsgiServiceRegistryImpl$ServiceTrackingProxy.invoke(OsgiServiceRegistryImpl.java:89)
      com.sun.proxy.$Proxy197.create(Unknown Source)
      com.atlassian.confluence.pages.persistence.dao.bulk.copy.DefaultPageCopyService.copyPageProperties(DefaultPageCopyService.java:646)
      com.atlassian.confluence.pages.persistence.dao.bulk.copy.DefaultPageCopyService.lambda$copyOtherEntities$13(DefaultPageCopyService.java:551)
      com.atlassian.confluence.pages.persistence.dao.bulk.copy.DefaultPageCopyService.safeAction(DefaultPageCopyService.java:442)
      com.atlassian.confluence.pages.persistence.dao.bulk.copy.DefaultPageCopyService.copyOtherEntities(DefaultPageCopyService.java:546)
      com.atlassian.confluence.pages.persistence.dao.bulk.copy.DefaultPageCopyService.saveAsNewPage(DefaultPageCopyService.java:744)
      com.atlassian.confluence.pages.persistence.dao.bulk.copy.DefaultPageCopyService.copyPage(DefaultPageCopyService.java:509)
      com.atlassian.confluence.pages.persistence.dao.bulk.copy.DefaultPageCopyService.access$500(DefaultPageCopyService.java:108)
      com.atlassian.confluence.pages.persistence.dao.bulk.copy.DefaultPageCopyService$BulkPageCopyAction.process(DefaultPageCopyService.java:874)
      com.atlassian.confluence.pages.persistence.dao.bulk.copy.DefaultPageCopyService$BulkPageCopyAction.process(DefaultPageCopyService.java:837)
      com.atlassian.confluence.impl.hibernate.bulk.RecursiveHibernateBulkAction.executeInternal(RecursiveHibernateBulkAction.java:97)
      com.atlassian.confluence.impl.hibernate.bulk.RecursiveHibernateBulkAction.executeInternal(RecursiveHibernateBulkAction.java:111)
      com.atlassian.confluence.impl.hibernate.bulk.RecursiveHibernateBulkAction.execute(RecursiveHibernateBulkAction.java:54)
      com.atlassian.confluence.pages.persistence.dao.bulk.copy.DefaultPageCopyService.deepCopyInternal(DefaultPageCopyService.java:320)
      com.atlassian.confluence.pages.persistence.dao.bulk.copy.DefaultPageCopyService.deepCopy(DefaultPageCopyService.java:225)
      sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      java.lang.reflect.Method.invoke(Unknown Source)
      org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
      org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
      org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)
      org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      com.atlassian.spring.interceptors.SpringProfilingInterceptor.invoke(SpringProfilingInterceptor.java:16)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      cloud.atlassian.logmon.datadog.publisher.internal.DefaultFunctionalTimeRecorder.with(DefaultFunctionalTimeRecorder.java:24)
      com.atlassian.confluence.util.profiling.ConfluenceMonitoringMethodInterceptor.invoke(ConfluenceMonitoringMethodInterceptor.java:39)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
      com.sun.proxy.$Proxy254.deepCopy(Unknown Source)
      com.atlassian.confluence.api.impl.service.longtasks.BulkPageCopyTaskRunner.runTask(BulkPageCopyTaskRunner.java:178)
      com.atlassian.progress.amq.TaskProcessor.accept(TaskProcessor.java:63)
      com.atlassian.progress.amq.TaskProcessor.accept(TaskProcessor.java:23)
      com.atlassian.progress.amq.ConcurrencyControlTaskProcessor.accept(ConcurrencyControlTaskProcessor.java:68)
      com.atlassian.progress.amq.ConcurrencyControlTaskProcessor.accept(ConcurrencyControlTaskProcessor.java:19)
      com.atlassian.progress.amq.ProgressAwareMessageRunner.processMessage(ProgressAwareMessageRunner.java:55)
      com.atlassian.confluence.impl.messagequeue.VCacheMessageRunner.lambda$processMessage$0(VCacheMessageRunner.java:21)
      com.atlassian.confluence.vcache.VCacheRequestContextOperations.lambda$doInRequestContext$0(VCacheRequestContextOperations.java:49)
      com.atlassian.confluence.impl.vcache.VCacheRequestContextManager.doInRequestContext(VCacheRequestContextManager.java:84)
      com.atlassian.confluence.impl.vcache.VCacheRequestContextManager.doInRequestContext(VCacheRequestContextManager.java:74)
      com.atlassian.confluence.vcache.VCacheRequestContextOperations.doInRequestContext(VCacheRequestContextOperations.java:48)
      com.atlassian.confluence.impl.messagequeue.VCacheMessageRunner.processMessage(VCacheMessageRunner.java:20)
      com.atlassian.confluence.util.zipkin.impl.ZipkinMessageRunner.processMessage(ZipkinMessageRunner.java:31)
      com.atlassian.messagequeue.internal.core.NestedMessageConsumer.consume(NestedMessageConsumer.java:113)
      com.atlassian.messagequeue.internal.sqs.SQSMessageConsumer.consumeMessage(SQSMessageConsumer.java:248)
      com.atlassian.messagequeue.internal.sqs.SQSMessageConsumer.processReceiveMessageResult(SQSMessageConsumer.java:198)
      com.atlassian.messagequeue.internal.sqs.SQSMessageConsumer.run(SQSMessageConsumer.java:123)
      java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
      java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
      java.lang.Thread.run(Unknown Source)
         }
         level: ERROR
         logger: com.atlassian.confluence.pages.persistence.dao.bulk.copy.DefaultPageCopyService
         message: An exception occurred while trying to do a bulk page copy operation
      

      Workaround

      Currently there is no known workaround for this behavior. A workaround will be added here when available

      Attachments

        Issue Links

          Activity

            People

              cd055fd0d3e8 Lucas Pan
              rtoropov@atlassian.com Roman Toropov
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: