Uploaded image for project: 'Bamboo Data Center'
  1. Bamboo Data Center
  2. BAM-20248

Scheduler worker thread pool can completely block with a thread waiting for CONNECT response from outbound proxy

    XMLWordPrintable

Details

    Description

      Issue Summary

      The scheduler worker thread pool can completely block with a hung TCP connection waiting for an HTTP CONNECT response from an outbound proxy because there's no SocketTimeout.

      Once the worker thread pool is blocked, all scheduled Bamboo tasks won't run. Included, but not limited to:

      • Scheduled background deletion
      • Scheduled triggers
      • Automatic elastic agent management

      If the scheduler worker thread is stuck holding a lock on the remote event status/application link status cache it may even cause certain UI actions in the Bamboo Administration panel to completely hang as they depend on retrieving status from that cache.

      Environment

      • Bitbucket application link
      • Having any application link from Bamboo to another Atlassian application go via an outbound proxy, even if Bitbucket is not.

      Steps to Reproduce

      1. Start Bamboo connected to a proper outbound proxy e.g. Squid on port 8080
      2. Create an Application Link to Bitbucket Server
      3. Create a plan with a Bitbucket Server Repository and a Bitbucket Server repository triggered trigger
        • It's important that we have a valid connected application link first, or we never appear to get to the point where the Stash Polling job performs an outbound request which is why I used a proper outbound proxy to reproduce.
      4. Stop the outbound proxy and replace it with a generic TCP listener on the same port. E.g. netcat:
        sudo nc -k -l 8080
        
        • It's important the TCP connection can be established but there is no response to the HTTP CONNECT.
      5. After ~180 seconds (3 minutes), 1 scheduler worker should attempt to run the Stash Polling quartz job and hang waiting for a response to the HTTP CONNECT.
        • This may vary in time on later versions due to the applink inbound connection status cache.
      6. After a further 1620 seconds (27 minutes) the remaining 9 scheduler worker threads should also block waiting for the cache to be populated by the one runnable / never-ending thread.

      Expected Results

      Socket timeout should be hit and an exception should be thrown.

      Actual Results

      Thread sits waiting indefinitely until the TCP connection is closed or Bamboo is restarted. Each scheduler thread gets put into an infinite wait each time a Stash Polling Quartz job is run while waiting for cache population. Eventually, the whole thread pool is starved and no scheduled jobs run.

      Example runnable thread:

      "scheduler_Worker-3" #41 prio=5 os_prio=0 tid=0x00007f979fb6d800 nid=0x3617 runnable [0x00007f977e9f6000]
         java.lang.Thread.State: RUNNABLE
      	at java.net.SocketInputStream.socketRead0(Native Method)
      	at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
      	at java.net.SocketInputStream.read(SocketInputStream.java:171)
      	at java.net.SocketInputStream.read(SocketInputStream.java:141)
      	at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
      	at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
      	at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:282)
      	at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138)
      	at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
      	at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
      	at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
      	at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:165)
      	at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
      	at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
      	at org.apache.http.impl.execchain.MainClientExec.createTunnelToTarget(MainClientExec.java:473)
      	at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:398)
      	at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237)
      	at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
      	at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
      	at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
      	at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
      	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
      	at com.atlassian.sal.core.net.HttpClientRequest.executeAndReturn(HttpClientRequest.java:103)
      	at com.atlassian.plugins.rest.module.jersey.JerseyRequest.executeAndReturn(JerseyRequest.java:131)
      	at com.atlassian.applinks.core.auth.ApplicationLinkRequestAdaptor.executeAndReturn(ApplicationLinkRequestAdaptor.java:53)
      	at com.atlassian.applinks.oauth.auth.OAuthRequest.executeAndReturn(OAuthRequest.java:84)
      	at com.atlassian.event.remote.impl.diagnostics.RemoteConnectionTester.sendAuthorizedRequest(RemoteConnectionTester.java:150)
      	at com.atlassian.event.remote.impl.diagnostics.RemoteConnectionTester.canRemoteAcceptEvents(RemoteConnectionTester.java:75)
      	at com.atlassian.event.remote.impl.diagnostics.DefaultRemoteEventConnectionStatus.getApplicationLinkStatus(DefaultRemoteEventConnectionStatus.java:160)
      	at com.atlassian.event.remote.impl.diagnostics.DefaultRemoteEventConnectionStatus.getApplicationLinkStatus(DefaultRemoteEventConnectionStatus.java:146)
      	at com.atlassian.event.remote.impl.diagnostics.DefaultRemoteEventConnectionStatus.access$000(DefaultRemoteEventConnectionStatus.java:44)
      	at com.atlassian.event.remote.impl.diagnostics.DefaultRemoteEventConnectionStatus$1.load(DefaultRemoteEventConnectionStatus.java:82)
      	at com.atlassian.event.remote.impl.diagnostics.DefaultRemoteEventConnectionStatus$1.load(DefaultRemoteEventConnectionStatus.java:79)
      	at com.atlassian.cache.ehcache.LoadingCache.getFromLoader(LoadingCache.java:145)
      	at com.atlassian.cache.ehcache.LoadingCache.loadValueAndReleaseLock(LoadingCache.java:100)
      	at com.atlassian.cache.ehcache.LoadingCache.get(LoadingCache.java:76)
      	at com.atlassian.cache.ehcache.DelegatingCache.get(DelegatingCache.java:97)
      	at com.atlassian.event.remote.impl.diagnostics.DefaultRemoteEventConnectionStatus.getConnectionStatus(DefaultRemoteEventConnectionStatus.java:118)
      	at com.atlassian.event.remote.impl.diagnostics.DefaultRemoteEventConnectionStatus.getConnectionStatus(DefaultRemoteEventConnectionStatus.java:107)
      	at sun.reflect.GeneratedMethodAccessor1617.invoke(Unknown Source)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:498)
      	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302)
      	at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:56)
      	at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:60)
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
      	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      	at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:70)
      	at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:53)
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      	at org.eclipse.gemini.blueprint.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:57)
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
      	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
      	at com.sun.proxy.$Proxy1460.getConnectionStatus(Unknown Source)
      	at com.atlassian.bamboo.plugin.stash.remote.event.status.RemoteEventsConnectionStatusServiceImpl.getStatus(RemoteEventsConnectionStatusServiceImpl.java:69)
      	at com.atlassian.bamboo.plugin.stash.remote.event.status.RemoteEventsConnectionStatusServiceImpl.getInboundConnectionStatus(RemoteEventsConnectionStatusServiceImpl.java:90)
      	at sun.reflect.GeneratedMethodAccessor1616.invoke(Unknown Source)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:498)
      	at com.atlassian.bamboo.plugin.osgi.InvocationHandlers$ClassLoaderSwitchingInvocationHandler.invokeServiceMethod(InvocationHandlers.java:71)
      	at com.atlassian.bamboo.plugin.osgi.InvocationHandlers$DynamicServiceInvocationHandler.invoke(InvocationHandlers.java:45)
      	at com.sun.proxy.$Proxy1543.getInboundConnectionStatus(Unknown Source)
      	at com.atlassian.bamboo.plugins.stash.trigger.StashTriggerQuartzJob$1.load(StashTriggerQuartzJob.java:57)
      	at com.atlassian.bamboo.plugins.stash.trigger.StashTriggerQuartzJob$1.load(StashTriggerQuartzJob.java:54)
      	at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527)
      	at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2319)
      	at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2282)
      	- locked <0x00000000f1051490> (a com.google.common.cache.LocalCache$StrongWriteEntry)
      	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2197)
      	at com.google.common.cache.LocalCache.get(LocalCache.java:3937)
      	at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3941)
      	at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4824)
      	at com.atlassian.bamboo.plugins.stash.trigger.StashTriggerQuartzJob.getConnectionStatus(StashTriggerQuartzJob.java:163)
      	at com.atlassian.bamboo.plugins.stash.trigger.StashTriggerQuartzJob.lambda$execute$0(StashTriggerQuartzJob.java:102)
      	at com.atlassian.bamboo.plugins.stash.trigger.StashTriggerQuartzJob$$Lambda$459/689069067.test(Unknown Source)
      	at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
      	at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
      	at java.util.Iterator.forEachRemaining(Iterator.java:116)
      	at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
      	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
      	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
      	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
      	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
      	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
      	at com.atlassian.bamboo.plugins.stash.trigger.StashTriggerQuartzJob.execute(StashTriggerQuartzJob.java:111)
      	at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
      	at com.atlassian.bamboo.utils.BambooRunnables$1.run(BambooRunnables.java:48)
      	at com.atlassian.bamboo.security.ImpersonationHelper.runWith(ImpersonationHelper.java:26)
      	at com.atlassian.bamboo.security.ImpersonationHelper.runWithSystemAuthority(ImpersonationHelper.java:17)
      	at com.atlassian.bamboo.security.ImpersonationHelper$1.run(ImpersonationHelper.java:41)
      	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
      	- locked <0x00000000857701b8> (a java.lang.Object)
      

      Example waiting thread:

      "scheduler_Worker-2" #40 prio=5 os_prio=0 tid=0x00007f979fb6c000 nid=0x3616 waiting on condition [0x00007f977eaf8000]
         java.lang.Thread.State: WAITING (parking)
      	at sun.misc.Unsafe.park(Native Method)
      	- parking to wait for  <0x000000008d8300a0> (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync)
      	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.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:727)
      	at net.sf.ehcache.concurrent.ReadWriteLockSync.lock(ReadWriteLockSync.java:50)
      	at net.sf.ehcache.constructs.blocking.BlockingCache.acquiredLockForKey(BlockingCache.java:196)
      	at net.sf.ehcache.constructs.blocking.BlockingCache.get(BlockingCache.java:158)
      	at com.atlassian.cache.ehcache.LoadingCache.get(LoadingCache.java:75)
      	at com.atlassian.cache.ehcache.DelegatingCache.get(DelegatingCache.java:97)
      	at com.atlassian.event.remote.impl.diagnostics.DefaultRemoteEventConnectionStatus.getConnectionStatus(DefaultRemoteEventConnectionStatus.java:118)
      	at com.atlassian.event.remote.impl.diagnostics.DefaultRemoteEventConnectionStatus.getConnectionStatus(DefaultRemoteEventConnectionStatus.java:107)
      	at sun.reflect.GeneratedMethodAccessor1617.invoke(Unknown Source)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:498)
      	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302)
      	at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:56)
      	at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:60)
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
      	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      	at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:70)
      	at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:53)
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      	at org.eclipse.gemini.blueprint.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:57)
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
      	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
      	at com.sun.proxy.$Proxy1460.getConnectionStatus(Unknown Source)
      	at com.atlassian.bamboo.plugin.stash.remote.event.status.RemoteEventsConnectionStatusServiceImpl.getStatus(RemoteEventsConnectionStatusServiceImpl.java:69)
      	at com.atlassian.bamboo.plugin.stash.remote.event.status.RemoteEventsConnectionStatusServiceImpl.getInboundConnectionStatus(RemoteEventsConnectionStatusServiceImpl.java:90)
      	at sun.reflect.GeneratedMethodAccessor1616.invoke(Unknown Source)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:498)
      	at com.atlassian.bamboo.plugin.osgi.InvocationHandlers$ClassLoaderSwitchingInvocationHandler.invokeServiceMethod(InvocationHandlers.java:71)
      	at com.atlassian.bamboo.plugin.osgi.InvocationHandlers$DynamicServiceInvocationHandler.invoke(InvocationHandlers.java:45)
      	at com.sun.proxy.$Proxy1543.getInboundConnectionStatus(Unknown Source)
      	at com.atlassian.bamboo.plugins.stash.trigger.StashTriggerQuartzJob$1.load(StashTriggerQuartzJob.java:57)
      	at com.atlassian.bamboo.plugins.stash.trigger.StashTriggerQuartzJob$1.load(StashTriggerQuartzJob.java:54)
      	at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527)
      	at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2319)
      	at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2282)
      	- locked <0x00000000f1050140> (a com.google.common.cache.LocalCache$StrongWriteEntry)
      	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2197)
      	at com.google.common.cache.LocalCache.get(LocalCache.java:3937)
      	at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3941)
      	at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4824)
      	at com.atlassian.bamboo.plugins.stash.trigger.StashTriggerQuartzJob.getConnectionStatus(StashTriggerQuartzJob.java:163)
      	at com.atlassian.bamboo.plugins.stash.trigger.StashTriggerQuartzJob.lambda$execute$0(StashTriggerQuartzJob.java:102)
      	at com.atlassian.bamboo.plugins.stash.trigger.StashTriggerQuartzJob$$Lambda$459/689069067.test(Unknown Source)
      	at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
      	at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
      	at java.util.Iterator.forEachRemaining(Iterator.java:116)
      	at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
      	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
      	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
      	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
      	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
      	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
      	at com.atlassian.bamboo.plugins.stash.trigger.StashTriggerQuartzJob.execute(StashTriggerQuartzJob.java:111)
      	at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
      	at com.atlassian.bamboo.utils.BambooRunnables$1.run(BambooRunnables.java:48)
      	at com.atlassian.bamboo.security.ImpersonationHelper.runWith(ImpersonationHelper.java:26)
      	at com.atlassian.bamboo.security.ImpersonationHelper.runWithSystemAuthority(ImpersonationHelper.java:17)
      	at com.atlassian.bamboo.security.ImpersonationHelper$1.run(ImpersonationHelper.java:41)
      	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
      	- locked <0x000000008576fea8> (a java.lang.Object)
      

      Workaround

      • Once in this state, Bamboo must be restarted to recover.

      To avoid it in future you can:

      • Allow access to Bitbucket (and all other application links, such as Jira) via a non-proxied route and add the domain to http.nonProxyHosts system property or investigate why the proxy is intermittently not replying to CONNECT requests.

      OR

      • Run a local proxy on the Bamboo server localhost and create custom rules to forward the traffic to the desired upstream proxy if necessary. You will need to run software such as TinyProxy, Squid, Privoxy, Delegated, etc. This strategy assumes the outbound proxy software running on the Bamboo server will be able to handle the exposed scenario where the upstream proxy is unresponsive, your mileage may vary.
      • Here's a configuration example with TinyProxy that will forward all the traffic to the 197.17.128.205 proxy host on port 80. It will bypass local addresses, local domains and any hosts within a Bitbucket mirror domain name. Tinyproxy fails after ~30s in case the upstream proxy doesn't respond and reports the socket failure back to the client (Bamboo) correctly.
        tinyproxy.conf, listening on localhost port 8888
        ##
        ## tinyproxy.conf -- tinyproxy daemon configuration file
        ##
        User tinyproxy 
        Group tinyproxy
        Port 8888
        Timeout 600
        DefaultErrorFile "/usr/share/tinyproxy/default.html"
        StatFile "/usr/share/tinyproxy/stats.html"
        LogLevel Notice
        Listen 127.0.0.1
        Allow 127.0.0.1
        
        ##
        ## Upstream:
        ##
        
        # Disables upstream forwarding on local domains and CIDRs
        # -Dhttp.nonProxyHosts="mydomain.net|myclouddomain.net|mirror.mybitbucket.com|localhost|127.0.0.1|197.17.128.*" 
        upstream none "localhost"
        upstream none "127.0.0.1"
        upstream none "197.17.128.0/24"
        upstream none ".mydomain.net"
        upstream none ".myclouddomain.net"
        upstream none ".mirror.mybitbucket.com"
        
        # Generic upstream to forward proxy
        # -Dhttps.proxyHost=197.17.128.205 -Dhttps.proxyPort=80
        # -Dhttp.proxyHost=197.17.128.205 -Dhttp.proxyPort=80
        upstream http 197.17.128.205:80
        
      • Then on Bamboo, specify exactly the following proxy properties and restart it:
        -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=8888 -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888
        

      Attachments

        1. scheduler_Worker_threads_wait.png
          186 kB
          Eduardo Alvarenga

        Issue Links

          Activity

            People

              72548a1cec6d Wioletta Dys
              jowen@atlassian.com Jeremy Owen
              Votes:
              10 Vote for this issue
              Watchers:
              18 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: