Message10762
 
            
            
            
 
   
   
 
  | I think Jython is using netty's channel future incorrectly and causing a deadlock.
The netty docs say it is preferred to add asynchronous listeners rather than calling sync()/await() directly.
https://github.com/netty/netty/blob/4.0/transport/src/main/java/io/netty/channel/ChannelFuture.java#L96
Jython is doing things the incorrect way when closing sockets:
https://github.com/jythontools/jython/blob/master/Lib/_socket.py#L1059
In my twisted application running on jython I can easily cause deadlocks by using apache bench to load test the twisted web server. I think we can safely just add the rest of the shutdown code as a listener on the channel future like so:
diff --git a/Lib/_socket.py b/Lib/_socket.py
index 3b658e5..56d8f4d 100644
--- a/Lib/_socket.py
+++ b/Lib/_socket.py
@@ -1055,11 +1055,10 @@ class _realsocket(object):
             if self.channel is None:
                 return
-            try:
-                self.channel.close().sync()
-            except RejectedExecutionException:
-                # Do not care about tasks that attempt to schedule after close
-                pass
+            closeFuture = self.channel.close()
+            closeFuture.addListener(self.finishClosing)
+
+    def finishClosing(self, _):
         if self.socket_type == SERVER_SOCKET:
             log.debug("Shutting down server socket parent group", extra={"sock": self})
             self.parent_group.shutdownGracefully(0, 100, TimeUnit.MILLISECONDS)
If I apply that patch, I can no longer cause the deadlock. |  |
 
| Date | User | Action | Args |  | 2016-02-22 23:04:33 | nickmbailey | set | recipients:
  + nickmbailey |  | 2016-02-22 23:04:33 | nickmbailey | set | messageid: <1456182273.0.0.638747602719.issue2471@psf.upfronthosting.co.za> |  | 2016-02-22 23:04:32 | nickmbailey | link | issue2471 messages |  | 2016-02-22 23:04:31 | nickmbailey | create |  | 
 |