8144144: ORB destroy() leaks filedescriptors after unsuccessful connection

Tue, 16 Feb 2016 12:37:44 +0000

author
msheppar
date
Tue, 16 Feb 2016 12:37:44 +0000
changeset 1205
803798e13dd5
parent 1204
961d6ccd9bd1
child 1207
1bb52ca92240
child 1212
6f09f3dfcba3

8144144: ORB destroy() leaks filedescriptors after unsuccessful connection
Reviewed-by: chegar, coffeys

src/share/classes/com/sun/corba/se/impl/transport/CorbaInboundConnectionCacheImpl.java file | annotate | diff | comparison | revisions
src/share/classes/com/sun/corba/se/impl/transport/CorbaTransportManagerImpl.java file | annotate | diff | comparison | revisions
src/share/classes/com/sun/corba/se/impl/transport/SelectorImpl.java file | annotate | diff | comparison | revisions
src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelAcceptorImpl.java file | annotate | diff | comparison | revisions
src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelConnectionImpl.java file | annotate | diff | comparison | revisions
src/share/classes/com/sun/corba/se/pept/transport/InboundConnectionCache.java file | annotate | diff | comparison | revisions
     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.

mercurial