Tue, 16 Feb 2016 12:37:44 +0000
8144144: ORB destroy() leaks filedescriptors after unsuccessful connection
Reviewed-by: chegar, coffeys
1.1 --- a/src/share/classes/com/sun/corba/se/impl/transport/CorbaInboundConnectionCacheImpl.java Mon Feb 01 16:27:27 2016 -0800 1.2 +++ b/src/share/classes/com/sun/corba/se/impl/transport/CorbaInboundConnectionCacheImpl.java Tue Feb 16 12:37:44 2016 +0000 1.3 @@ -54,11 +54,17 @@ 1.4 { 1.5 protected Collection connectionCache; 1.6 1.7 + private Acceptor acceptor; 1.8 + 1.9 public CorbaInboundConnectionCacheImpl(ORB orb, Acceptor acceptor) 1.10 { 1.11 super(orb, acceptor.getConnectionCacheType(), 1.12 ((CorbaAcceptor)acceptor).getMonitoringName()); 1.13 this.connectionCache = new ArrayList(); 1.14 + this.acceptor = acceptor; 1.15 + if (orb.transportDebugFlag) { 1.16 + dprint(": " + acceptor ); 1.17 + } 1.18 } 1.19 1.20 //////////////////////////////////////////////////// 1.21 @@ -66,11 +72,25 @@ 1.22 // pept.transport.InboundConnectionCache 1.23 // 1.24 1.25 + public void close () { 1.26 + 1.27 + super.close(); 1.28 + if (orb.transportDebugFlag) { 1.29 + dprint(".close: " + acceptor ); 1.30 + } 1.31 + this.acceptor.close(); 1.32 + 1.33 + } 1.34 + 1.35 public Connection get(Acceptor acceptor) 1.36 { 1.37 throw wrapper.methodShouldNotBeCalled(); 1.38 } 1.39 1.40 + public Acceptor getAcceptor () { 1.41 + return acceptor; 1.42 + } 1.43 + 1.44 public void put(Acceptor acceptor, Connection connection) 1.45 { 1.46 if (orb.transportDebugFlag) {
2.1 --- a/src/share/classes/com/sun/corba/se/impl/transport/CorbaTransportManagerImpl.java Mon Feb 01 16:27:27 2016 -0800 2.2 +++ b/src/share/classes/com/sun/corba/se/impl/transport/CorbaTransportManagerImpl.java Tue Feb 16 12:37:44 2016 +0000 2.3 @@ -188,8 +188,9 @@ 2.4 for (Object cc : outboundConnectionCaches.values()) { 2.5 ((ConnectionCache)cc).close() ; 2.6 } 2.7 - for (Object cc : inboundConnectionCaches.values()) { 2.8 - ((ConnectionCache)cc).close() ; 2.9 + for (Object icc : inboundConnectionCaches.values()) { 2.10 + ((ConnectionCache)icc).close() ; 2.11 + unregisterAcceptor(((InboundConnectionCache)icc).getAcceptor()); 2.12 } 2.13 getSelector(0).close(); 2.14 } finally {
3.1 --- a/src/share/classes/com/sun/corba/se/impl/transport/SelectorImpl.java Mon Feb 01 16:27:27 2016 -0800 3.2 +++ b/src/share/classes/com/sun/corba/se/impl/transport/SelectorImpl.java Tue Feb 16 12:37:44 2016 +0000 3.3 @@ -26,16 +26,20 @@ 3.4 package com.sun.corba.se.impl.transport; 3.5 3.6 import java.io.IOException; 3.7 +import java.net.ServerSocket; 3.8 import java.nio.channels.ClosedChannelException; 3.9 import java.nio.channels.SelectableChannel; 3.10 +import java.nio.channels.ServerSocketChannel; 3.11 import java.nio.channels.SelectionKey; 3.12 import java.nio.channels.Selector; 3.13 +import java.nio.channels.ClosedSelectorException; 3.14 import java.util.ArrayList; 3.15 import java.util.HashMap; 3.16 import java.util.Map; 3.17 import java.util.Iterator; 3.18 import java.util.List; 3.19 3.20 + 3.21 import com.sun.corba.se.pept.broker.Broker; 3.22 import com.sun.corba.se.pept.transport.Acceptor; 3.23 import com.sun.corba.se.pept.transport.Connection; 3.24 @@ -111,7 +115,16 @@ 3.25 interestOpsList.add(keyAndOp); 3.26 } 3.27 // tell Selector Thread there's an update to a SelectorKey's Ops 3.28 - selector.wakeup(); 3.29 + try { 3.30 + if (selector != null) { 3.31 + // wakeup Selector thread to process close request 3.32 + selector.wakeup(); 3.33 + } 3.34 + } catch (Throwable t) { 3.35 + if (orb.transportDebugFlag) { 3.36 + dprint(".registerInterestOps: selector.wakeup: ", t); 3.37 + } 3.38 + } 3.39 } 3.40 else { 3.41 wrapper.selectionKeyInvalid(eventHandler.toString()); 3.42 @@ -186,7 +199,9 @@ 3.43 if (selectionKey != null) { 3.44 selectionKey.cancel(); 3.45 } 3.46 - selector.wakeup(); 3.47 + if (selector != null) { 3.48 + selector.wakeup(); 3.49 + } 3.50 return; 3.51 } 3.52 3.53 @@ -239,6 +254,8 @@ 3.54 readerThread.close(); 3.55 } 3.56 3.57 + clearDeferredRegistrations(); 3.58 + 3.59 // Selector 3.60 3.61 try { 3.62 @@ -248,7 +265,7 @@ 3.63 } 3.64 } catch (Throwable t) { 3.65 if (orb.transportDebugFlag) { 3.66 - dprint(".close: selector.close: " + t); 3.67 + dprint(".close: selector.wakeup: ", t); 3.68 } 3.69 } 3.70 } 3.71 @@ -273,15 +290,16 @@ 3.72 n = selector.select(timeout); 3.73 } catch (IOException e) { 3.74 if (orb.transportDebugFlag) { 3.75 - dprint(".run: selector.select: " + e); 3.76 + dprint(".run: selector.select: ", e); 3.77 } 3.78 + } catch (ClosedSelectorException csEx) { 3.79 + if (orb.transportDebugFlag) { 3.80 + dprint(".run: selector.select: ", csEx); 3.81 + } 3.82 + break; 3.83 } 3.84 if (closed) { 3.85 - selector.close(); 3.86 - if (orb.transportDebugFlag) { 3.87 - dprint(".run: closed - .run return"); 3.88 - } 3.89 - return; 3.90 + break; 3.91 } 3.92 /* 3.93 if (timeout == 0 && orb.transportDebugFlag) { 3.94 @@ -321,6 +339,18 @@ 3.95 } 3.96 } 3.97 } 3.98 + try { 3.99 + if (selector != null) { 3.100 + if (orb.transportDebugFlag) { 3.101 + dprint(".run: selector.close "); 3.102 + } 3.103 + selector.close(); 3.104 + } 3.105 + } catch (Throwable t) { 3.106 + if (orb.transportDebugFlag) { 3.107 + dprint(".run: selector.close: ", t); 3.108 + } 3.109 + } 3.110 } 3.111 3.112 ///////////////////////////////////////////////////// 3.113 @@ -328,6 +358,44 @@ 3.114 // Implementation. 3.115 // 3.116 3.117 + private void clearDeferredRegistrations() { 3.118 + synchronized (deferredRegistrations) { 3.119 + int deferredListSize = deferredRegistrations.size(); 3.120 + if (orb.transportDebugFlag) { 3.121 + dprint(".clearDeferredRegistrations:deferred list size == " + deferredListSize); 3.122 + } 3.123 + for (int i = 0; i < deferredListSize; i++) { 3.124 + EventHandler eventHandler = 3.125 + (EventHandler)deferredRegistrations.get(i); 3.126 + if (orb.transportDebugFlag) { 3.127 + dprint(".clearDeferredRegistrations: " + eventHandler); 3.128 + } 3.129 + SelectableChannel channel = eventHandler.getChannel(); 3.130 + SelectionKey selectionKey = null; 3.131 + 3.132 + try { 3.133 + if (orb.transportDebugFlag) { 3.134 + dprint(".clearDeferredRegistrations:close channel == " 3.135 + + channel); 3.136 + dprint(".clearDeferredRegistrations:close channel class == " 3.137 + + channel.getClass().getName()); 3.138 + } 3.139 + channel.close(); 3.140 + selectionKey = eventHandler.getSelectionKey(); 3.141 + if (selectionKey != null) { 3.142 + selectionKey.cancel(); 3.143 + selectionKey.attach(null); 3.144 + } 3.145 + } catch (IOException ioEx) { 3.146 + if (orb.transportDebugFlag) { 3.147 + dprint(".clearDeferredRegistrations: ", ioEx); 3.148 + } 3.149 + } 3.150 + } 3.151 + deferredRegistrations.clear(); 3.152 + } 3.153 + } 3.154 + 3.155 private synchronized boolean isClosed () 3.156 { 3.157 return closed; 3.158 @@ -344,7 +412,7 @@ 3.159 selector = Selector.open(); 3.160 } catch (IOException e) { 3.161 if (orb.transportDebugFlag) { 3.162 - dprint(".startSelector: Selector.open: IOException: " + e); 3.163 + dprint(".startSelector: Selector.open: IOException: ", e); 3.164 } 3.165 // REVISIT - better handling/reporting 3.166 RuntimeException rte = 3.167 @@ -379,7 +447,7 @@ 3.168 (Object)eventHandler); 3.169 } catch (ClosedChannelException e) { 3.170 if (orb.transportDebugFlag) { 3.171 - dprint(".handleDeferredRegistrations: " + e); 3.172 + dprint(".handleDeferredRegistrations: ", e); 3.173 } 3.174 } 3.175 eventHandler.setSelectionKey(selectionKey);
4.1 --- a/src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelAcceptorImpl.java Mon Feb 01 16:27:27 2016 -0800 4.2 +++ b/src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelAcceptorImpl.java Tue Feb 16 12:37:44 2016 +0000 4.3 @@ -264,7 +264,12 @@ 4.4 4.5 if (connection.shouldRegisterServerReadEvent()) { 4.6 Selector selector = orb.getTransportManager().getSelector(0); 4.7 - selector.registerForEvent(connection.getEventHandler()); 4.8 + if (selector != null) { 4.9 + if (orb.transportDebugFlag) { 4.10 + dprint(".accept: registerForEvent: " + connection); 4.11 + } 4.12 + selector.registerForEvent(connection.getEventHandler()); 4.13 + } 4.14 } 4.15 4.16 getConnectionCache().reclaim(); 4.17 @@ -273,12 +278,15 @@ 4.18 if (orb.transportDebugFlag) { 4.19 dprint(".accept:", e); 4.20 } 4.21 - orb.getTransportManager().getSelector(0).unregisterForEvent(this); 4.22 - // REVISIT - need to close - recreate - then register new one. 4.23 - orb.getTransportManager().getSelector(0).registerForEvent(this); 4.24 - // NOTE: if register cycling we do not want to shut down ORB 4.25 - // since local beans will still work. Instead one will see 4.26 - // a growing log file to alert admin of problem. 4.27 + Selector selector = orb.getTransportManager().getSelector(0); 4.28 + if (selector != null) { 4.29 + selector.unregisterForEvent(this); 4.30 + // REVISIT - need to close - recreate - then register new one. 4.31 + selector.registerForEvent(this); 4.32 + // NOTE: if register cycling we do not want to shut down ORB 4.33 + // since local beans will still work. Instead one will see 4.34 + // a growing log file to alert admin of problem. 4.35 + } 4.36 } 4.37 } 4.38 4.39 @@ -289,7 +297,9 @@ 4.40 dprint(".close->:"); 4.41 } 4.42 Selector selector = orb.getTransportManager().getSelector(0); 4.43 - selector.unregisterForEvent(this); 4.44 + if (selector != null) { 4.45 + selector.unregisterForEvent(this); 4.46 + } 4.47 if (serverSocketChannel != null) { 4.48 serverSocketChannel.close(); 4.49 } 4.50 @@ -480,7 +490,9 @@ 4.51 // of calling SelectionKey.interestOps(<interest op>). 4.52 4.53 Selector selector = orb.getTransportManager().getSelector(0); 4.54 - selector.registerInterestOps(this); 4.55 + if (selector != null) { 4.56 + selector.registerInterestOps(this); 4.57 + } 4.58 4.59 if (orb.transportDebugFlag) { 4.60 dprint(".doWork<-:" + this);
5.1 --- a/src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelConnectionImpl.java Mon Feb 01 16:27:27 2016 -0800 5.2 +++ b/src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelConnectionImpl.java Tue Feb 16 12:37:44 2016 +0000 5.3 @@ -367,7 +367,10 @@ 5.4 } 5.5 } 5.6 // REVISIT - make sure reader thread is killed. 5.7 - orb.getTransportManager().getSelector(0).unregisterForEvent(this); 5.8 + Selector selector = orb.getTransportManager().getSelector(0); 5.9 + if (selector != null) { 5.10 + selector.unregisterForEvent(this); 5.11 + } 5.12 // Notify anyone waiting. 5.13 purgeCalls(wrapper.connectionAbort(ex), true, false); 5.14 // REVISIT 5.15 @@ -801,7 +804,9 @@ 5.16 } 5.17 try { 5.18 Selector selector = orb.getTransportManager().getSelector(0); 5.19 - selector.unregisterForEvent(this); 5.20 + if (selector != null) { 5.21 + selector.unregisterForEvent(this); 5.22 + } 5.23 if (socketChannel != null) { 5.24 socketChannel.close(); 5.25 } 5.26 @@ -824,7 +829,9 @@ 5.27 dprint(".closeConnectionResources->: " + this); 5.28 } 5.29 Selector selector = orb.getTransportManager().getSelector(0); 5.30 - selector.unregisterForEvent(this); 5.31 + if (selector != null) { 5.32 + selector.unregisterForEvent(this); 5.33 + } 5.34 try { 5.35 if (socketChannel != null) 5.36 socketChannel.close() ;
6.1 --- a/src/share/classes/com/sun/corba/se/pept/transport/InboundConnectionCache.java Mon Feb 01 16:27:27 2016 -0800 6.2 +++ b/src/share/classes/com/sun/corba/se/pept/transport/InboundConnectionCache.java Tue Feb 16 12:37:44 2016 +0000 6.3 @@ -36,6 +36,8 @@ 6.4 public void put(Acceptor acceptor, Connection connection); 6.5 6.6 public void remove(Connection connection); 6.7 + 6.8 + public Acceptor getAcceptor(); 6.9 } 6.10 6.11 // End of file.