Details
-
Bug
-
Resolution: Fixed
-
Medium
-
Severity 3 - Minor
-
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
- As User 1
- Create a new space named SRC with default permissions.
- Create a new blank page.
- Set page restrictions on the newly created page so that only User 1 can edit.
- As User 2:
- Create a new space named DEST with default permissions.
- Use the copy page hierarchy to copy the SRC home page to the DEST home page.
- Set copyAttachments, copyPermissions, copyProperties, copyLabels = true.
- Use a unique prefix (e.g. [TEST]).
- 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