[ 
https://issues.apache.org/jira/browse/TINKERPOP3-972?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15011108#comment-15011108
 ] 

ASF GitHub Bot commented on TINKERPOP3-972:
-------------------------------------------

Github user spmallette commented on the pull request:

    
https://github.com/apache/incubator-tinkerpop/pull/146#issuecomment-157733926
  
    Thanks for noticing this and offering a fix.  Somehow I missed closing that 
executor.
    
    Looking at your PR, you do a `executor().shutdownNow()` in 
`Cluster.close()`.  That still leaves a problem for those doing 
`Cluster.closeAsync()` as that executor will continue to hang around. Maybe 
your change should somehow be down here: 
    
    
https://github.com/apache/incubator-tinkerpop/blob/0feaa8b47de2797e177310cd1ea3bf38d7230420/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Cluster.java#L607
    
    maybe you tack something on to the `closeIt` future to shutdown the 
executor after if finishes all its jobs? or maybe we don't use the executor for 
shutdown of the channel so that we separate that task from any other running 
activities?  do you have any thoughts on how best to do this?



> Cluster::close does not shut down its executor
> ----------------------------------------------
>
>                 Key: TINKERPOP3-972
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP3-972
>             Project: TinkerPop 3
>          Issue Type: Bug
>          Components: driver
>    Affects Versions: 3.0.2-incubating
>            Reporter: Pierre Laporte
>            Assignee: stephen mallette
>
> *Context*
> Using the Gremlin driver in a Java application, I can create a {{Cluster}} 
> and a {{Client}} to send some queries to my Gremlin server.
> However, my application never finishes because some Gremlin worker threads 
> stay alive, even though I call {{cluster.close()}}.
> *Cause*
> Those threads are never terminated:
> {code}
> "gremlin-driver-worker-4" #25 prio=5 os_prio=31 tid=0x00007f824ca4a800 
> nid=0x6a07 waiting on condition [0x0000700001df0000]
>    java.lang.Thread.State: WAITING (parking)
>       at sun.misc.Unsafe.park(Native Method)
>       - parking to wait for  <0x000000076edb9158> (a 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
>       at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
>       at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081)
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
>       at 
> java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
>       at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>       at java.lang.Thread.run(Thread.java:745)
> "gremlin-driver-worker-3" #23 prio=5 os_prio=31 tid=0x00007f824ca46800 
> nid=0x6803 waiting on condition [0x0000700001ced000]
>    java.lang.Thread.State: WAITING (parking)
>       at sun.misc.Unsafe.park(Native Method)
>       - parking to wait for  <0x000000076edb9158> (a 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
>       at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
>       at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081)
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
>       at 
> java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
>       at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>       at java.lang.Thread.run(Thread.java:745)
> "gremlin-driver-worker-2" #22 prio=5 os_prio=31 tid=0x00007f824e22f800 
> nid=0x6603 waiting on condition [0x0000700001bea000]
>    java.lang.Thread.State: WAITING (parking)
>       at sun.misc.Unsafe.park(Native Method)
>       - parking to wait for  <0x000000076edb9158> (a 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
>       at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
>       at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081)
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
>       at 
> java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
>       at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>       at java.lang.Thread.run(Thread.java:745)
> "gremlin-driver-worker-1" #21 prio=5 os_prio=31 tid=0x00007f824e21f000 
> nid=0x6403 waiting on condition [0x0000700001ae7000]
>    java.lang.Thread.State: WAITING (parking)
>       at sun.misc.Unsafe.park(Native Method)
>       - parking to wait for  <0x000000076edb9158> (a 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
>       at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
>       at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081)
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
>       at 
> java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
>       at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>       at java.lang.Thread.run(Thread.java:745)
> {code}
> *Workaround*
> This code block can solve the issue on the caller side, but relies on 
> reflection and might break any time the implementation changes:
> {code:java}
>     private void fixThreadLeakInGremlinCluster(Cluster cluster) {
>         try {
>             Method executorAccessor = 
> Cluster.class.getDeclaredMethod("executor");
>             executorAccessor.setAccessible(true);
>             ScheduledExecutorService executor = (ScheduledExecutorService) 
> executorAccessor.invoke(cluster);
>             executor.shutdownNow();
>         } catch (Exception e) {
>             e.printStackTrace();
>         }
>     }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to