Hi Ryan,

Can you share the complete test code, including how you create the jclouds
context and the loop you're using, so I can run it to reproduce the issue?

Thanks!

I.
El 05/05/2015 21:11, "Ryan Shoemaker" <[email protected]>
escribió:

>  Hi,
>
> I'm running jclouds 1.8.0 with Guava 17.0 and I'm seeing threads allocated
> every time I create an SshClient, but they are never released and
> eventually pile up until the JVM can't allocate any additional threads
> (java.lang.OutOfMemoryError: unable to create new native thread).
>
> I hacked java.lang.Thread in my JDK to provide logging information every
> time a thread is created, renamed, or stopped and here's a stack I captured
> of the thread created during the creation of an SshClient:
>
> init() pool-124-thread-1
>    at java.lang.Thread.init(Thread.java:350)
>    at java.lang.Thread.init(Thread.java:330)
>    at java.lang.Thread.<init>(Thread.java:650)
>    at 
> java.util.concurrent.Executors$DefaultThreadFactory.newThread(Executors.java:572)
>    at 
> com.google.common.util.concurrent.ThreadFactoryBuilder$1.newThread(ThreadFactoryBuilder.java:162)
>    at 
> java.util.concurrent.ThreadPoolExecutor$Worker.<init>(ThreadPoolExecutor.java:610)
>    at 
> java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:925)
>    at 
> java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1361)
>    at 
> com.google.common.util.concurrent.MoreExecutors$ListeningDecorator.execute(MoreExecutors.java:484)
>    at 
> java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:106)
>    at 
> com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:50)
>    at 
> org.jclouds.concurrent.config.WithSubmissionTrace$ListeningExecutorService.submit(WithSubmissionTrace.java:69)
>    at 
> org.jclouds.compute.util.ConcurrentOpenSocketFinder$2.apply(ConcurrentOpenSocketFinder.java:130)
>    at 
> org.jclouds.compute.util.ConcurrentOpenSocketFinder$2.apply(ConcurrentOpenSocketFinder.java:123)
>    at com.google.common.base.Predicates$OrPredicate.apply(Predicates.java:393)
>    at 
> org.jclouds.util.Predicates2$RetryablePredicate.apply(Predicates2.java:111)
>    at 
> org.jclouds.compute.util.ConcurrentOpenSocketFinder.findOpenSocketOnNode(ConcurrentOpenSocketFinder.java:99)
>    at 
> org.jclouds.compute.functions.CreateSshClientOncePortIsListeningOnNode.apply(CreateSshClientOncePortIsListeningOnNode.java:66)
>    at 
> org.jclouds.compute.functions.CreateSshClientOncePortIsListeningOnNode.apply(CreateSshClientOncePortIsListeningOnNode.java:40)
>    at <my application code below here that creates the SshClient>
>
>
> This thread is subsequently renamed something along the lines of "user
> thread 0" and the stack for the actual thread is:
>
>
> Thread "user thread 0" thread-id: 1,853 thread-state: WAITING Waiting on 
> lock: 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@33a82f62
>          at: sun.misc.Unsafe.park(Native Method)
>          at: java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
>          at: 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
>          at: 
> java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:386)
>          at: 
> java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1069)
>          at: 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131)
>          at: 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>          at: java.lang.Thread.run(Thread.java:701)
>
>
> Here's my test code:
>
>                 SshClient ssh = null;
>                 try {
>                     ComputeService compute = ...;
>                     NodeMetadata meta = compute.getNodeMetadata(...);
>                     final LoginCredentials login
>                         = 
> LoginCredentials.builder().identity("username").privateKey(...).noPassword().build();
>                     NodeMetadata newMeta =
>                         NodeMetadataBuilder
>                             .fromNodeMetadata(meta)
>                             .credentials(login).build();
>                     Utils utils = compute.getContext().utils();
>                     ssh = utils.sshForNode().apply(newMeta);
>                     ssh.connect();
>                     Thread.sleep(5000);
>                 } catch (Exception ignored) {}
>                 finally {
>                     if (ssh != null) ssh.disconnect();
>                 }
>
>
> I threw this code in a 10 iteration loop and watched the JVM in jconsole.
> After this code completes, there are 10 additional threads named "user
> thread n" hanging around that never exit.
>
> Any idea what is preventing these threads from exiting?  Any suggestions
> on what to try next?
>
> Thanks,
>
> --Ryan
>
>
>

Reply via email to