asciidoctor-gradle-plugin icon indicating copy to clipboard operation
asciidoctor-gradle-plugin copied to clipboard

Asciidoctor task hangs after updating to 3.0.0

Open slue919 opened this issue 5 years ago • 7 comments

After updating from id 'org.asciidoctor.jvm.convert' version '2.4.0' to id 'org.asciidoctor.jvm.convert' version '3.0.0' the asciidoctor task hangs infinitely.

The task configuration is:

asciidoctor {
  baseDir = file('src')
  sourceDir = file('src')
  sources {
    include '**/*.adoc'  
  }
  outputDir = file('dist/docs')
  logDocuments = true
}

Gradle hangs in the near of:

"Execution worker for ':'" #95 prio=5 os_prio=0 tid=0x0000000017979800 nid=0x460 runnable [0x000000002438d000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.fs.WindowsNativeDispatcher.CreateFile0(Native Method)
        at sun.nio.fs.WindowsNativeDispatcher.CreateFile(WindowsNativeDispatcher.java:71)
        at sun.nio.fs.WindowsPath.openForReadAttributeAccess(WindowsPath.java:781)
        at sun.nio.fs.WindowsFileSystemProvider.isSameFile(WindowsFileSystemProvider.java:425)
        at java.nio.file.Files.isSameFile(Files.java:1504)
        at java.nio.file.FileTreeWalker.wouldLoop(FileTreeWalker.java:248)
        at java.nio.file.FileTreeWalker.visit(FileTreeWalker.java:292)
        at java.nio.file.FileTreeWalker.next(FileTreeWalker.java:372)
        at java.nio.file.Files.walkFileTree(Files.java:2706)
        at org.gradle.api.internal.file.collections.jdk7.Jdk7DirectoryWalker.walkDir(Jdk7DirectoryWalker.java:59)
        at org.gradle.api.internal.file.collections.DirectoryFileTree.walkDir(DirectoryFileTree.java:154)
        at org.gradle.api.internal.file.collections.DirectoryFileTree.visitFrom(DirectoryFileTree.java:132)
        at org.gradle.api.internal.file.collections.DirectoryFileTree.visit(DirectoryFileTree.java:117)
        at org.gradle.api.internal.file.collections.FileTreeAdapter.visit(FileTreeAdapter.java:118)
        at org.gradle.api.internal.file.AbstractFileTree.getFiles(AbstractFileTree.java:57)
        at org.gradle.api.internal.file.AbstractFileCollection.iterator(AbstractFileCollection.java:72)
        at org.gradle.api.internal.file.AbstractFileCollection$4.iterator(AbstractFileCollection.java:222)
        at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext$FileTreeConverter.convertInto(DefaultFileCollectionResolveContext.java:209)
        at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext.doResolve(DefaultFileCollectionResolveContext.java:114)
        at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext.resolveAsFileTrees(DefaultFileCollectionResolveContext.java:85)
        at org.gradle.api.internal.file.CompositeFileCollection$1.visitContents(CompositeFileCollection.java:130)
        at org.gradle.api.internal.file.CompositeFileCollection.getSourceCollections(CompositeFileCollection.java:191)
        at org.gradle.api.internal.file.CompositeFileTree.getSourceCollections(CompositeFileTree.java:39)
        at org.gradle.api.internal.file.CompositeFileCollection.contains(CompositeFileCollection.java:88)
        at org.asciidoctor.gradle.base.AbstractAsciidoctorBaseTask$_getSecondarySourceFileTreeFrom_closure11$_closure22.doCall(AbstractAsciidoctorBaseTask.groovy:730)
        at sun.reflect.GeneratedMethodAccessor155.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

Seems that it is still looking for the adoc files.

Any ideas of whats wrong? Can I do any thing?

slue919 avatar Jan 29 '20 11:01 slue919

Do you have any mermaid diagrams in your adoc files?

AlexCzar avatar Mar 02 '20 11:03 AlexCzar

No. But some plantuml diagrams.

After limiting the adoc-files to

sources {
       include 'bcs_for_config.adoc', 'bcs_for_dev.adoc'
}

It still waits a while (~20 sec) (same area as on the stacktrace above). But than it processes the two files successfully.

slue919 avatar Mar 04 '20 17:03 slue919

May be the other part of the stacktrace is important to.

It seems that it is waiting before asciidoctor is actually executed. Gradle ist still trying to dermine the state of the asciidoctor task input to check whether its up-to-date or not. Maybe this interferes with asciidoctor tasks way to determine its secondary resources ?

Execution worker for ':'  Runnable CPU usage on sample: 1s
  sun.nio.fs.WindowsNativeDispatcher.FindNextFile(long, long) WindowsNativeDispatcher.java (native)
  sun.nio.fs.WindowsDirectoryStream$WindowsDirectoryIterator.readNextEntry() WindowsDirectoryStream.java:175
  sun.nio.fs.WindowsDirectoryStream$WindowsDirectoryIterator.hasNext() WindowsDirectoryStream.java:209
  java.nio.file.FileTreeWalker.next() FileTreeWalker.java:348
  java.nio.file.Files.walkFileTree(Path, Set, int, FileVisitor) Files.java:2706
  org.gradle.api.internal.file.collections.jdk7.Jdk7DirectoryWalker.walkDir(File, RelativePath, FileVisitor, Spec, AtomicBoolean, boolean) Jdk7DirectoryWalker.java:59
  org.gradle.api.internal.file.collections.DirectoryFileTree.walkDir(File, RelativePath, FileVisitor, Spec, AtomicBoolean) DirectoryFileTree.java:154
  org.gradle.api.internal.file.collections.DirectoryFileTree.visitFrom(FileVisitor, File, RelativePath) DirectoryFileTree.java:132
  org.gradle.api.internal.file.collections.DirectoryFileTree.visit(FileVisitor) DirectoryFileTree.java:117
  org.gradle.api.internal.file.collections.FileTreeAdapter.visit(FileVisitor) FileTreeAdapter.java:118
  org.gradle.api.internal.file.AbstractFileTree.getFiles() AbstractFileTree.java:57
  org.gradle.api.internal.file.AbstractFileCollection.iterator() AbstractFileCollection.java:72
  org.gradle.api.internal.file.AbstractFileCollection$4.iterator() AbstractFileCollection.java:222
  org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext$FileTreeConverter.convertInto(Object, Collection, PathToFileResolver) DefaultFileCollectionResolveContext.java:209
  org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext.doResolve(DefaultFileCollectionResolveContext$Converter) DefaultFileCollectionResolveContext.java:114
  org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext.resolveAsFileTrees() DefaultFileCollectionResolveContext.java:85
  org.gradle.api.internal.file.CompositeFileCollection$1.visitContents(FileCollectionResolveContext) CompositeFileCollection.java:130
  org.gradle.api.internal.file.CompositeFileCollection.getSourceCollections() CompositeFileCollection.java:191
  org.gradle.api.internal.file.CompositeFileTree.getSourceCollections() CompositeFileTree.java:39
  org.gradle.api.internal.file.CompositeFileCollection.contains(File) CompositeFileCollection.java:88
  org.asciidoctor.gradle.base.AbstractAsciidoctorBaseTask$_getSecondarySourceFileTreeFrom_closure11$_closure23.doCall(FileTreeElement) AbstractAsciidoctorBaseTask.groovy:731
  sun.reflect.GeneratedMethodAccessor295.invoke(Object, Object[])
  sun.reflect.DelegatingMethodAccessorImpl.invoke(Object, Object[]) DelegatingMethodAccessorImpl.java:43
  java.lang.reflect.Method.invoke(Object, Object[]) Method.java:498
  org.codehaus.groovy.reflection.CachedMethod.invoke(Object, Object[]) CachedMethod.java:104
  groovy.lang.MetaMethod.doMethodInvoke(Object, Object[]) MetaMethod.java:326
  org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(Class, Object, String, Object[], boolean, boolean) ClosureMetaClass.java:264
  groovy.lang.MetaClassImpl.invokeMethod(Object, String, Object[]) MetaClassImpl.java:1041
  groovy.lang.Closure.call(Object[]) Closure.java:411
  org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(Object, Method, Object[]) ConvertedClosure.java:50
  org.codehaus.groovy.runtime.ConversionHandler.invoke(Object, Method, Object[]) ConversionHandler.java:122
  com.sun.proxy.$Proxy73.isSatisfiedBy(Object)
  org.gradle.api.specs.OrSpec.isSatisfiedBy(Object) OrSpec.java:47
  org.gradle.api.specs.NotSpec.isSatisfiedBy(Object) NotSpec.java:35
  org.gradle.api.specs.AndSpec.isSatisfiedBy(Object) AndSpec.java:47
  org.gradle.internal.snapshot.impl.DirectorySnapshotter$1.isAllowed(Path, String, boolean, BasicFileAttributes, Iterable) DirectorySnapshotter.java:156
  org.gradle.internal.snapshot.impl.DirectorySnapshotter$1.visitFile(Path, BasicFileAttributes) DirectorySnapshotter.java:93
  org.gradle.internal.snapshot.impl.DirectorySnapshotter$1.visitFile(Object, BasicFileAttributes) DirectorySnapshotter.java:78
  java.nio.file.Files.walkFileTree(Path, Set, int, FileVisitor) Files.java:2670
  org.gradle.internal.snapshot.impl.DirectorySnapshotter.snapshot(String, PatternSet, MutableBoolean) DirectorySnapshotter.java:78
  org.gradle.internal.snapshot.impl.DefaultFileSystemSnapshotter.snapshot(String, PatternSet, File, FileMetadataSnapshot, MutableBoolean) DefaultFileSystemSnapshotter.java:165
  org.gradle.internal.snapshot.impl.DefaultFileSystemSnapshotter.snapshotAndCache(DefaultFileSystemSnapshotter$InternableString, File, FileMetadataSnapshot, PatternSet) DefaultFileSystemSnapshotter.java:149
  org.gradle.internal.snapshot.impl.DefaultFileSystemSnapshotter.snapshotAndCache(File, PatternSet) DefaultFileSystemSnapshotter.java:133
  org.gradle.internal.snapshot.impl.DefaultFileSystemSnapshotter.access$200(DefaultFileSystemSnapshotter, File, PatternSet) DefaultFileSystemSnapshotter.java:62
  org.gradle.internal.snapshot.impl.DefaultFileSystemSnapshotter$3.create() DefaultFileSystemSnapshotter.java:195
  org.gradle.internal.snapshot.impl.DefaultFileSystemSnapshotter$3.create() DefaultFileSystemSnapshotter.java:190
  org.gradle.cache.internal.ProducerGuard$StripedProducerGuard.guardByKey(Object, Factory) ProducerGuard.java:115
  org.gradle.internal.snapshot.impl.DefaultFileSystemSnapshotter.snapshotDirectoryTree(File, PatternSet) DefaultFileSystemSnapshotter.java:190
  org.gradle.internal.snapshot.impl.DefaultFileSystemSnapshotter$FileCollectionLeafVisitorImpl.visitFileTree(File, PatternSet) DefaultFileSystemSnapshotter.java:252
  org.gradle.api.internal.file.collections.FileTreeAdapter.visitLeafCollections(FileCollectionLeafVisitor) FileTreeAdapter.java:126
  org.gradle.api.internal.file.CompositeFileCollection.visitLeafCollections(FileCollectionLeafVisitor) CompositeFileCollection.java:205
  org.gradle.internal.snapshot.impl.DefaultFileSystemSnapshotter.snapshot(FileCollectionInternal) DefaultFileSystemSnapshotter.java:126
  org.gradle.internal.fingerprint.impl.AbstractFileCollectionFingerprinter.fingerprint(FileCollection) AbstractFileCollectionFingerprinter.java:48
  org.gradle.api.internal.tasks.execution.DefaultTaskFingerprinter.fingerprintTaskFiles(TaskInternal, SortedSet) DefaultTaskFingerprinter.java:45
  org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionStateTaskExecuter.createExecutionState(TaskInternal, TaskProperties, AfterPreviousExecutionState, ImmutableSortedMap) ResolveBeforeExecutionStateTaskExecuter.java:93
  org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionStateTaskExecuter.execute(TaskInternal, TaskStateInternal, TaskExecutionContext) ResolveBeforeExecutionStateTaskExecuter.java:73
  org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(TaskInternal, TaskStateInternal, TaskExecutionContext) ValidatingTaskExecuter.java:62
  org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(TaskInternal, TaskStateInternal, TaskExecutionContext) SkipEmptySourceFilesTaskExecuter.java:108
  org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(TaskInternal, TaskStateInternal, TaskExecutionContext) ResolveBeforeExecutionOutputsTaskExecuter.java:67
  org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(TaskInternal, TaskStateInternal, TaskExecutionContext) ResolveAfterPreviousExecutionStateTaskExecuter.java:46
  org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(TaskInternal, TaskStateInternal, TaskExecutionContext) CleanupStaleOutputsExecuter.java:94
  org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(TaskInternal, TaskStateInternal, TaskExecutionContext) FinalizePropertiesTaskExecuter.java:46
  org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(TaskInternal, TaskStateInternal, TaskExecutionContext) ResolveTaskExecutionModeExecuter.java:95
  org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(TaskInternal, TaskStateInternal, TaskExecutionContext) SkipTaskWithNoActionsExecuter.java:57
  org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(TaskInternal, TaskStateInternal, TaskExecutionContext) SkipOnlyIfTaskExecuter.java:56
  org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(TaskInternal, TaskStateInternal, TaskExecutionContext) CatchExceptionTaskExecuter.java:36
  org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(BuildOperationContext) EventFiringTaskExecuter.java:73
  org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(BuildOperationContext) EventFiringTaskExecuter.java:52
  org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(BuildOperationContext) EventFiringTaskExecuter.java:49
  org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(CallableBuildOperation, BuildOperationContext) DefaultBuildOperationExecutor.java:416
  org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(BuildOperation, BuildOperationContext) DefaultBuildOperationExecutor.java:406
  org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(BuildOperationDescriptor, DefaultBuildOperationExecutor$DefaultBuildOperationContext, DefaultBuildOperationExecutor$BuildOperationExecutionListener) DefaultBuildOperationExecutor.java:165
  org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(BuildOperationDescriptor$Builder, DefaultBuildOperationExecutor$BuildOperationState, DefaultBuildOperationExecutor$BuildOperationExecution) DefaultBuildOperationExecutor.java:250
  org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(BuildOperation, BuildOperationWorker, DefaultBuildOperationExecutor$BuildOperationState) DefaultBuildOperationExecutor.java:158
  org.gradle.internal.operations.DefaultBuildOperationExecutor.call(CallableBuildOperation) DefaultBuildOperationExecutor.java:102
  org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(CallableBuildOperation) DelegatingBuildOperationExecutor.java:36
  org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(TaskInternal, TaskStateInternal, TaskExecutionContext) EventFiringTaskExecuter.java:49
  org.gradle.execution.plan.LocalTaskNodeExecutor.execute(Node, ProjectExecutionServiceRegistry) LocalTaskNodeExecutor.java:43
  org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(Node) DefaultTaskExecutionGraph.java:355
  org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(Object) DefaultTaskExecutionGraph.java:343
  org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(Node) DefaultTaskExecutionGraph.java:336
  org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(Object) DefaultTaskExecutionGraph.java:322
  org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(Node) DefaultPlanExecutor.java:134
  org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(Object) DefaultPlanExecutor.java:129
  org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(Node, WorkerLeaseRegistry$WorkerLease, Action) DefaultPlanExecutor.java:202
  org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(WorkerLeaseRegistry$WorkerLease, Action) DefaultPlanExecutor.java:193
  org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run() DefaultPlanExecutor.java:129
  org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(Runnable) ExecutorPolicy.java:63
  org.gradle.internal.concurrent.ManagedExecutorImpl$1.run() ManagedExecutorImpl.java:46
  java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) ThreadPoolExecutor.java:1149
  java.util.concurrent.ThreadPoolExecutor$Worker.run() ThreadPoolExecutor.java:624
  org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run() ThreadFactoryImpl.java:55
  java.lang.Thread.run() Thread.java:748

slue919 avatar Mar 05 '20 11:03 slue919

This looks like a Windows-specific issue. Does it solve the problem running 3.1.0 (of the Gradle plugin, not Windows 3.1 :stuck_out_tongue: )

ysb33r avatar Apr 12 '20 07:04 ysb33r

Thanks, but trying 3.1.0 does not work too. Even on a linux box it does not work.

It seems it depends on the total number of files to select the adoc-files. The adoc-files are between some thousands on other files.

As wokaround it works if I copy the adoc-file to a separte location.

task copyDocs(type: Copy) {
  from('src') {
    include '**/*.adoc' 
  }
  into 'tmp/docs'
  includeEmptyDirs = false
}

asciidoctor {
  dependsOn 'copyDocs'
  baseDir = file('tmp/docs')
  sourceDir = file('tmp/docs')
  sources {
    include '**/*.adoc'  
  }
  outputDir = file('dist/docs')
  logDocuments = true
}

Note: if I remove the includeEmptyDirs = false from the copy task there will be some thousand empty directories. Then the plugin seems to hang again.

slue919 avatar Apr 26 '20 21:04 slue919

When upgrading the https://github.com/gradle/gradle build, we encountered the same issue. I have a PR open that should hopefully fix this: see #590

ljacomet avatar Feb 08 '21 21:02 ljacomet

A workaround exists if you do not need the secondarySources feature:

task.clearSecondarySources();
task.secondarySources(patternSet -> {
    patternSet.include("doesNotExist.not");
});

ljacomet avatar Feb 08 '21 21:02 ljacomet