Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Possible dead-lock in Tycho repository transport #2725

Closed
laeubi opened this issue Aug 23, 2023 · 2 comments
Closed

Possible dead-lock in Tycho repository transport #2725

laeubi opened this issue Aug 23, 2023 · 2 comments

Comments

@laeubi
Copy link
Member

laeubi commented Aug 23, 2023

org.eclipse.tycho.p2maven.transport.TychoRepositoryTransport.stream(URI, IProgressMonitor) is syncronized what means that if one request blocks all others are blocked as well

Thread wich currently hangs in an operation:

"BuilderThread 8" #80 prio=5 os_prio=0 cpu=72.23ms elapsed=672.77s tid=0x00007ffabe7a27d0 nid=0xe85 waiting on condition  [0x00007ff93b7f4000]
   java.lang.Thread.State: WAITING (parking)
	at jdk.internal.misc.Unsafe.park(java.base@17.0.2/Native Method)
	- parking to wait for  <0x0000000436ee5e48> (a java.util.concurrent.CompletableFuture$Signaller)
	at java.util.concurrent.locks.LockSupport.park(java.base@17.0.2/LockSupport.java:211)
	at java.util.concurrent.CompletableFuture$Signaller.block(java.base@17.0.2/CompletableFuture.java:1864)
	at java.util.concurrent.ForkJoinPool.unmanagedBlock(java.base@17.0.2/ForkJoinPool.java:3463)
	at java.util.concurrent.ForkJoinPool.managedBlock(java.base@17.0.2/ForkJoinPool.java:3434)
	at java.util.concurrent.CompletableFuture.waitingGet(java.base@17.0.2/CompletableFuture.java:1898)
	at java.util.concurrent.CompletableFuture.get(java.base@17.0.2/CompletableFuture.java:2072)
	at jdk.internal.net.http.HttpClientImpl.send(java.net.http@17.0.2/HttpClientImpl.java:553)
	at jdk.internal.net.http.HttpClientFacade.send(java.net.http@17.0.2/HttpClientFacade.java:123)
	at org.eclipse.tycho.p2maven.transport.Java11HttpTransportFactory$Java11HttpTransport.performGet(Java11HttpTransportFactory.java:142)
	at org.eclipse.tycho.p2maven.transport.Java11HttpTransportFactory$Java11HttpTransport.get(Java11HttpTransportFactory.java:105)
	at org.eclipse.tycho.p2maven.transport.SharedHttpCacheStorage$CacheLine.fetchFile(SharedHttpCacheStorage.java:252)
	- locked <0x0000000436edf8f0> (a org.eclipse.tycho.p2maven.transport.SharedHttpCacheStorage$CacheLine)
	at org.eclipse.tycho.p2maven.transport.SharedHttpCacheStorage$2.getCacheFile(SharedHttpCacheStorage.java:136)
	at org.eclipse.tycho.p2maven.transport.HttpTransportProtocolHandler.getFile(HttpTransportProtocolHandler.java:50)
	at org.eclipse.tycho.p2maven.transport.TychoRepositoryTransport.stream(TychoRepositoryTransport.java:141)
	- locked <0x000000041a913a78> (a org.eclipse.tycho.p2maven.transport.TychoRepositoryTransport)
	at org.eclipse.tycho.p2maven.transport.TychoRepositoryTransport.download(TychoRepositoryTransport.java:101)
	at org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactRepository.downloadArtifact(SimpleArtifactRepository.java:734)
	at org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactRepository.downloadArtifact(SimpleArtifactRepository.java:656)
	at org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactRepository.getArtifact(SimpleArtifactRepository.java:793)
	at org.eclipse.tycho.p2.repository.RepositoryArtifactProvider.getArtifactFromOneMirror(RepositoryArtifactProvider.java:243)
	at org.eclipse.tycho.p2.repository.RepositoryArtifactProvider.getArtifactFromAnyMirror(RepositoryArtifactProvider.java:223)
	at org.eclipse.tycho.p2.repository.RepositoryArtifactProvider$1.perform(RepositoryArtifactProvider.java:198)
	at org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactRepository.getArtifact(SimpleArtifactRepository.java:775)
	at org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactRepository.getArtifacts(SimpleArtifactRepository.java:855)
	at org.eclipse.equinox.internal.p2.artifact.repository.CompositeArtifactRepository.getArtifacts(CompositeArtifactRepository.java:362)
	at org.eclipse.tycho.p2.repository.LazyArtifactRepository.getArtifacts(LazyArtifactRepository.java:102)
	at org.eclipse.tycho.p2.repository.RepositoryArtifactProvider.getArtifactFromAnyChildRepository(RepositoryArtifactProvider.java:210)
	at org.eclipse.tycho.p2.repository.RepositoryArtifactProvider.getArtifactFromAnyFormatAvailableInRepository(RepositoryArtifactProvider.java:177)
	at org.eclipse.tycho.p2.repository.RepositoryArtifactProvider.getArtifactFromAnySource(RepositoryArtifactProvider.java:163)
	at org.eclipse.tycho.p2.repository.CompositeArtifactProviderBaseImpl.getArtifact(CompositeArtifactProviderBaseImpl.java:55)
	at org.eclipse.tycho.p2.repository.MirroringArtifactProvider.downloadCanonicalArtifact(MirroringArtifactProvider.java:339)
	at org.eclipse.tycho.p2.repository.MirroringArtifactProvider.downloadMostSpecificNeededFormatOfArtifact(MirroringArtifactProvider.java:332)
	at org.eclipse.tycho.p2.repository.MirroringArtifactProvider.downloadArtifact(MirroringArtifactProvider.java:317)
	at org.eclipse.tycho.p2.repository.MirroringArtifactProvider.makeOneFormatLocallyAvailable(MirroringArtifactProvider.java:256)
	at org.eclipse.tycho.p2.repository.MirroringArtifactProvider.makeLocallyAvailable(MirroringArtifactProvider.java:206)
	at org.eclipse.tycho.p2.repository.MirroringArtifactProvider.getArtifactFile(MirroringArtifactProvider.java:137)
	at org.eclipse.tycho.p2.repository.CompositeArtifactProvider.getArtifactFile(CompositeArtifactProvider.java:89)
	at org.eclipse.tycho.p2resolver.TargetPlatformBaseImpl.getLocalArtifactFile(TargetPlatformBaseImpl.java:169)
	at org.eclipse.tycho.core.resolver.DefaultP2ResolutionResult.lambda$addArtifact$2(DefaultP2ResolutionResult.java:90)
	at org.eclipse.tycho.core.resolver.DefaultP2ResolutionResult$$Lambda$924/0x0000000801439438.get(Unknown Source)
	at org.eclipse.tycho.core.resolver.DefaultP2ResolutionResultEntry.getLocation(DefaultP2ResolutionResultEntry.java:73)
	at org.eclipse.tycho.p2resolver.P2DependencyResolver.lambda$newDefaultTargetPlatform$6(P2DependencyResolver.java:383)
	at org.eclipse.tycho.p2resolver.P2DependencyResolver$$Lambda$926/0x000000080143b018.get(Unknown Source)
	at org.eclipse.tycho.core.osgitools.targetplatform.ArtifactCollection.lambda$addArtifactFile$2(ArtifactCollection.java:69)
	at org.eclipse.tycho.core.osgitools.targetplatform.ArtifactCollection$$Lambda$927/0x000000080143b240.apply(Unknown Source)
	at org.eclipse.tycho.core.osgitools.DefaultArtifactDescriptor.getLocation(DefaultArtifactDescriptor.java:72)
	at org.eclipse.tycho.core.osgitools.targetplatform.ArtifactCollection.lambda$addArtifact$3(ArtifactCollection.java:148)
	at org.eclipse.tycho.core.osgitools.targetplatform.ArtifactCollection$$Lambda$929/0x000000080143b8d0.apply(Unknown Source)
	at org.eclipse.tycho.core.osgitools.DefaultArtifactDescriptor.getLocation(DefaultArtifactDescriptor.java:72)
	at org.eclipse.tycho.core.osgitools.targetplatform.ArtifactCollection.lambda$addArtifact$3(ArtifactCollection.java:148)
	at org.eclipse.tycho.core.osgitools.targetplatform.ArtifactCollection$$Lambda$929/0x000000080143b8d0.apply(Unknown Source)
	at org.eclipse.tycho.core.osgitools.DefaultArtifactDescriptor.getLocation(DefaultArtifactDescriptor.java:72)
	at org.eclipse.tycho.core.maven.MavenDependencyInjector.collectExternalDependencies(MavenDependencyInjector.java:216)
	at org.eclipse.tycho.core.maven.MavenDependencyInjector.addDependency(MavenDependencyInjector.java:180)
	at org.eclipse.tycho.core.maven.MavenDependencyInjector.injectMavenDependencies(MavenDependencyInjector.java:82)
	at org.eclipse.tycho.p2resolver.P2DependencyResolver.injectDependenciesIntoMavenModel(P2DependencyResolver.java:409)
	at org.eclipse.tycho.core.resolver.DefaultTychoResolver.resolveProject(DefaultTychoResolver.java:155)
	- locked <0x000000041a294348> (a org.eclipse.tycho.core.osgitools.DefaultReactorProject)
	at org.eclipse.tycho.core.maven.TychoProjectExecutionListener.beforeProjectLifecycleExecution(TychoProjectExecutionListener.java:108)
	at org.apache.maven.lifecycle.internal.CompoundProjectExecutionListener.beforeProjectLifecycleExecution(CompoundProjectExecutionListener.java:42)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:103)
	at io.takari.maven.builder.smart.SmartBuilderImpl.buildProject(SmartBuilderImpl.java:209)
	at io.takari.maven.builder.smart.SmartBuilderImpl$ProjectBuildTask.run(SmartBuilderImpl.java:81)
	at java.util.concurrent.Executors$RunnableAdapter.call(java.base@17.0.2/Executors.java:539)
	at java.util.concurrent.FutureTask.run(java.base@17.0.2/FutureTask.java:264)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.2/ThreadPoolExecutor.java:1136)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.2/ThreadPoolExecutor.java:635)
	at java.lang.Thread.run(java.base@17.0.2/Thread.java:833)

other threads hanging to enter the method:

"BuilderThread 13" #86 prio=5 os_prio=0 cpu=87.20ms elapsed=672.76s tid=0x00007ffabe7b5ea0 nid=0xe8b waiting for monitor entry  [0x00007ff93b1ee000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at org.eclipse.tycho.p2maven.transport.TychoRepositoryTransport.stream(TychoRepositoryTransport.java:131)
	- waiting to lock <0x000000041a913a78> (a org.eclipse.tycho.p2maven.transport.TychoRepositoryTransport)
	at org.eclipse.tycho.p2maven.transport.TychoRepositoryTransport.download(TychoRepositoryTransport.java:101)
	at org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactRepository.downloadArtifact(SimpleArtifactRepository.java:734)
	at org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactRepository.downloadArtifact(SimpleArtifactRepository.java:656)
	at org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactRepository.getArtifact(SimpleArtifactRepository.java:793)
	at org.eclipse.tycho.p2.repository.RepositoryArtifactProvider.getArtifactFromOneMirror(RepositoryArtifactProvider.java:243)
	at org.eclipse.tycho.p2.repository.RepositoryArtifactProvider.getArtifactFromAnyMirror(RepositoryArtifactProvider.java:223)
	at org.eclipse.tycho.p2.repository.RepositoryArtifactProvider$1.perform(RepositoryArtifactProvider.java:198)
	at org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactRepository.getArtifact(SimpleArtifactRepository.java:775)
	at org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactRepository.getArtifacts(SimpleArtifactRepository.java:855)
	at org.eclipse.equinox.internal.p2.artifact.repository.CompositeArtifactRepository.getArtifacts(CompositeArtifactRepository.java:362)
	at org.eclipse.tycho.p2.repository.LazyArtifactRepository.getArtifacts(LazyArtifactRepository.java:102)
	at org.eclipse.tycho.p2.repository.RepositoryArtifactProvider.getArtifactFromAnyChildRepository(RepositoryArtifactProvider.java:210)
	at org.eclipse.tycho.p2.repository.RepositoryArtifactProvider.getArtifactFromAnyFormatAvailableInRepository(RepositoryArtifactProvider.java:177)
	at org.eclipse.tycho.p2.repository.RepositoryArtifactProvider.getArtifactFromAnySource(RepositoryArtifactProvider.java:163)
	at org.eclipse.tycho.p2.repository.CompositeArtifactProviderBaseImpl.getArtifact(CompositeArtifactProviderBaseImpl.java:55)
	at org.eclipse.tycho.p2.repository.MirroringArtifactProvider.downloadCanonicalArtifact(MirroringArtifactProvider.java:339)
	at org.eclipse.tycho.p2.repository.MirroringArtifactProvider.downloadMostSpecificNeededFormatOfArtifact(MirroringArtifactProvider.java:332)
	at org.eclipse.tycho.p2.repository.MirroringArtifactProvider.downloadArtifact(MirroringArtifactProvider.java:317)
	at org.eclipse.tycho.p2.repository.MirroringArtifactProvider.makeOneFormatLocallyAvailable(MirroringArtifactProvider.java:256)
	at org.eclipse.tycho.p2.repository.MirroringArtifactProvider.makeLocallyAvailable(MirroringArtifactProvider.java:206)
	at org.eclipse.tycho.p2.repository.MirroringArtifactProvider.getArtifactFile(MirroringArtifactProvider.java:137)
	at org.eclipse.tycho.p2.repository.CompositeArtifactProvider.getArtifactFile(CompositeArtifactProvider.java:89)
	at org.eclipse.tycho.p2resolver.TargetPlatformBaseImpl.getLocalArtifactFile(TargetPlatformBaseImpl.java:169)
	at org.eclipse.tycho.core.resolver.DefaultP2ResolutionResult.lambda$addArtifact$2(DefaultP2ResolutionResult.java:90)
	at org.eclipse.tycho.core.resolver.DefaultP2ResolutionResult$$Lambda$924/0x0000000801439438.get(Unknown Source)
	at org.eclipse.tycho.core.resolver.DefaultP2ResolutionResultEntry.getLocation(DefaultP2ResolutionResultEntry.java:73)
	at org.eclipse.tycho.p2resolver.P2DependencyResolver.lambda$newDefaultTargetPlatform$6(P2DependencyResolver.java:383)
	at org.eclipse.tycho.p2resolver.P2DependencyResolver$$Lambda$926/0x000000080143b018.get(Unknown Source)
	at org.eclipse.tycho.core.osgitools.targetplatform.ArtifactCollection.lambda$addArtifactFile$2(ArtifactCollection.java:69)
	at org.eclipse.tycho.core.osgitools.targetplatform.ArtifactCollection$$Lambda$927/0x000000080143b240.apply(Unknown Source)
	at org.eclipse.tycho.core.osgitools.DefaultArtifactDescriptor.getLocation(DefaultArtifactDescriptor.java:72)
	at org.eclipse.tycho.core.osgitools.targetplatform.ArtifactCollection.lambda$addArtifact$3(ArtifactCollection.java:148)
	at org.eclipse.tycho.core.osgitools.targetplatform.ArtifactCollection$$Lambda$929/0x000000080143b8d0.apply(Unknown Source)
	at org.eclipse.tycho.core.osgitools.DefaultArtifactDescriptor.getLocation(DefaultArtifactDescriptor.java:72)
	at org.eclipse.tycho.core.osgitools.targetplatform.ArtifactCollection.lambda$addArtifact$3(ArtifactCollection.java:148)
	at org.eclipse.tycho.core.osgitools.targetplatform.ArtifactCollection$$Lambda$929/0x000000080143b8d0.apply(Unknown Source)
	at org.eclipse.tycho.core.osgitools.DefaultArtifactDescriptor.getLocation(DefaultArtifactDescriptor.java:72)
	at org.eclipse.tycho.core.maven.MavenDependencyInjector.collectExternalDependencies(MavenDependencyInjector.java:216)
	at org.eclipse.tycho.core.maven.MavenDependencyInjector.addDependency(MavenDependencyInjector.java:180)
	at org.eclipse.tycho.core.maven.MavenDependencyInjector.injectMavenDependencies(MavenDependencyInjector.java:82)
	at org.eclipse.tycho.p2resolver.P2DependencyResolver.injectDependenciesIntoMavenModel(P2DependencyResolver.java:409)
	at org.eclipse.tycho.core.resolver.DefaultTychoResolver.resolveProject(DefaultTychoResolver.java:155)
	- locked <0x0000000419d687e0> (a org.eclipse.tycho.core.osgitools.DefaultReactorProject)
	at org.eclipse.tycho.core.maven.TychoProjectExecutionListener.beforeProjectLifecycleExecution(TychoProjectExecutionListener.java:108)
	at org.apache.maven.lifecycle.internal.CompoundProjectExecutionListener.beforeProjectLifecycleExecution(CompoundProjectExecutionListener.java:42)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:103)
	at io.takari.maven.builder.smart.SmartBuilderImpl.buildProject(SmartBuilderImpl.java:209)
	at io.takari.maven.builder.smart.SmartBuilderImpl$ProjectBuildTask.run(SmartBuilderImpl.java:81)
	at java.util.concurrent.Executors$RunnableAdapter.call(java.base@17.0.2/Executors.java:539)
	at java.util.concurrent.FutureTask.run(java.base@17.0.2/FutureTask.java:264)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.2/ThreadPoolExecutor.java:1136)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.2/ThreadPoolExecutor.java:635)
	at java.lang.Thread.run(java.base@17.0.2/Thread.java:833)

Mitigation

We should not use a global lock on the transport here

@laeubi
Copy link
Member Author

laeubi commented Aug 23, 2023

Looking at the code I even can't remember why this should be synchronized at all, this seems a leftover from a refactoring where the transport was not a separate component, so if sync is required it should happen there and not for the transport.

@laeubi
Copy link
Member Author

laeubi commented Sep 4, 2023

Fixed with #2727

@laeubi laeubi closed this as completed Sep 4, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant