Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [tycho-user] Nexus p2 unzip plugin: Read lock during ZIP transfer to proxy

An update after some investigation of thread dumps and the p2 unzip plugin code.

The waits happen here, waiting for org.eclipse.tycho.nexus.internal.plugin.cache.PathLock#PathLockMonitor:
https://github.com/eclipse/tycho.nexus/blob/master/unzip-repository-plugin/src/main/java/org/eclipse/tycho/nexus/internal/plugin/cache/UnzipCache.java#L70

The comment in the code states that it's a workaround for https://issues.sonatype.org/browse/NEXUS-3622, which was resolved in Nov 2011.
Is there any chance that this code conflicts with later versions of Nexus?

Additional observation:
- Any HTTP get request in progress of the ZIP artifact (downloading via browser) makes the p2 unzip plugin's copy of the ZIP from the source repository tree to the virtual repository tree wait, so it is not specific to proxy repositories in any way.

I have attached the thread dump taken during the read lock, the interesting lines are 16 and 17.

Thanks again.

On 28/03/2017 17:45, Irene Wang wrote:
Hello,

Hopefully, this is the correct list to ask about an issue with the Nexus p2 unzip plugin. We're using version 0.15.0-SNAPSHOT of the p2 unzip plugin with instances of Nexus Pro 2.14.2-01. We are having problems with blocked read access to a ZIP artifact (and its corresponding p2 unzip virtual path) while that ZIP artifact is being transferred to a regular Maven proxy repository. This blocked read issue does not occur when there is no p2 unzip virtual repository sourcing the repository.

On our main Nexus instance, we have a Maven repository (A) with a p2 virtual repository (A') that sources repository A. On another "mirror" Nexus server, we have a Maven proxy repository (B) of the same repository A.

The symptom is that whenever a ZIP artifact is published to A and the proxy repository B has requested that ZIP artifact before the p2 unzipped version on A' is requested, both the original artifact on A and and the virtual artifact on A' are unreadable until the replication of the ZIP from A to B is complete (keeps attempting to load until the request times out). Once the transfer of the ZIP to the proxy repository B is finished, all paths on A, A' and B become accessible. The expected behaviour is that A and A' on the main instance would still be readable during the transfer of the ZIP to the proxy repository B. Again, this locking only happens when a p2 unzip virtual repository A' is configured with its source as A.

As our "mirror" Nexus is located in another geographical region, the transfer of ZIP artifacts from A to B can take quite some time, and in the meantime, the corresponding artifacts cannot be requested on the main Nexus, whether in ZIP (A) or p2 unzip (A') format.

Would anyone have any insight into a locking mechanism specific to the p2 unzip plugin that could explain what we're seeing, and if so, would there be a workaround or fix?

Thanks very much in advance,

Irene

qtp1429880200-2883 - Thread t@2883
   java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <71620d2> (a java.util.concurrent.Semaphore)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(AbstractQueuedSynchronizer.java:967)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(AbstractQueuedSynchronizer.java:1283)
at java.util.concurrent.Semaphore.acquireUninterruptibly(Semaphore.java:494)
at org.sonatype.sisu.locks.LocalResourceLock.acquire(LocalResourceLockFactory.java:83)
at org.sonatype.sisu.locks.AbstractSemaphoreResourceLock.lockExclusive(AbstractSemaphoreResourceLock.java:60)
at org.sonatype.nexus.proxy.item.SisuLockResource.lockExclusively(SisuLockResource.java:44)
at org.sonatype.nexus.proxy.item.DefaultRepositoryItemUidLock.lock(DefaultRepositoryItemUidLock.java:38)
at org.sonatype.nexus.proxy.storage.local.fs.DefaultFSPeer.storeItem(DefaultFSPeer.java:184)
at org.sonatype.nexus.proxy.storage.local.fs.DefaultFSLocalRepositoryStorage.storeItem(DefaultFSLocalRepositoryStorage.java:390)
at org.eclipse.tycho.nexus.internal.plugin.cache.UnzipCache.getArchive(UnzipCache.java:70)
- locked <679eb98d> (a org.eclipse.tycho.nexus.internal.plugin.cache.PathLock)
at org.eclipse.tycho.nexus.internal.plugin.DefaultUnzipRepository.getZippedItem(DefaultUnzipRepository.java:369)
at org.eclipse.tycho.nexus.internal.plugin.DefaultUnzipRepository.doRetrieveItem(DefaultUnzipRepository.java:310)
at org.sonatype.nexus.proxy.repository.AbstractRepository.retrieveItem(AbstractRepository.java:760)
at org.sonatype.nexus.proxy.repository.AbstractRepository.retrieveItem(AbstractRepository.java:592)
at org.sonatype.nexus.proxy.router.DefaultRepositoryRouter.retrieveItem(DefaultRepositoryRouter.java:155)
at org.sonatype.nexus.content.internal.ContentServlet.doGet(ContentServlet.java:381)
at org.sonatype.nexus.content.internal.ContentServlet.service(ContentServlet.java:347)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:297)
at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:281)
at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:186)
at com.google.inject.servlet.AbstractServletPipeline.service(AbstractServletPipeline.java:65)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:85)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:112)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at com.google.inject.servlet.AbstractFilterPipeline.dispatch(AbstractFilterPipeline.java:100)
at org.sonatype.nexus.web.internal.NexusGuiceFilter.doFilter(NexusGuiceFilter.java:82)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:89)
at com.google.inject.servlet.AbstractFilterPipeline.dispatch(AbstractFilterPipeline.java:100)
at org.sonatype.nexus.web.internal.NexusGuiceFilter.doFilter(NexusGuiceFilter.java:82)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:89)
at com.google.inject.servlet.AbstractFilterPipeline.dispatch(AbstractFilterPipeline.java:100)
at org.sonatype.nexus.web.internal.NexusGuiceFilter.doFilter(NexusGuiceFilter.java:82)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:89)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
at org.sonatype.nexus.web.internal.SecurityFilter.executeChain(SecurityFilter.java:90)
at org.apache.shiro.web.servlet.AbstractShiroFilter.call(AbstractShiroFilter.java:365)
at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at com.google.inject.servlet.AbstractFilterPipeline.dispatch(AbstractFilterPipeline.java:100)
at org.sonatype.nexus.web.internal.NexusGuiceFilter.doFilter(NexusGuiceFilter.java:82)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:89)
at com.sonatype.nexus.licensing.internal.LicensingRedirectFilter.doFilter(LicensingRedirectFilter.java:135)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at com.google.inject.servlet.AbstractFilterPipeline.dispatch(AbstractFilterPipeline.java:100)
at org.sonatype.nexus.web.internal.NexusGuiceFilter.doFilter(NexusGuiceFilter.java:82)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:89)
at com.yammer.metrics.web.WebappMetricsFilter.doFilter(WebappMetricsFilter.java:76)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at org.sonatype.nexus.web.internal.CommonHeadersFilter.doFilter(CommonHeadersFilter.java:69)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at org.sonatype.nexus.web.internal.ErrorPageFilter.doFilter(ErrorPageFilter.java:71)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at org.sonatype.nexus.web.internal.BaseUrlHolderFilter.doFilter(BaseUrlHolderFilter.java:66)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at com.google.inject.servlet.AbstractFilterPipeline.dispatch(AbstractFilterPipeline.java:100)
at org.sonatype.nexus.web.internal.NexusGuiceFilter.doFilter(NexusGuiceFilter.java:82)
at org.sonatype.nexus.web.internal.NexusGuiceFilter.dispatch(NexusGuiceFilter.java:56)
at com.google.inject.servlet.GuiceFilter.call(GuiceFilter.java:133)
at com.google.inject.servlet.GuiceFilter.call(GuiceFilter.java:130)
at com.google.inject.servlet.GuiceFilter.call(GuiceFilter.java:203)
- locked <4b384ae3> (a com.google.inject.servlet.GuiceFilter)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:130)
at org.eclipse.jetty.servlet.ServletHandler.doFilter(ServletHandler.java:1476)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at com.yammer.metrics.jetty.InstrumentedHandler.handle(InstrumentedHandler.java:200)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:370)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:1033)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:53)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThreadPool.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:745)
   Locked ownable synchronizers:
- None

Back to the top