You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2003/01/10 21:22:38 UTC

cvs commit: jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/res LocalStrings.properties LocalStrings_fr.properties

remm        2003/01/10 12:22:38

  Modified:    util/java/org/apache/tomcat/util/net PoolTcpEndpoint.java
               util/java/org/apache/tomcat/util/net/res
                        LocalStrings.properties LocalStrings_fr.properties
  Log:
  - Refactor the server socket restart code.
  
  Revision  Changes    Path
  1.12      +76 -55    jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/PoolTcpEndpoint.java
  
  Index: PoolTcpEndpoint.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/PoolTcpEndpoint.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- PoolTcpEndpoint.java	1 Jan 2003 13:55:22 -0000	1.11
  +++ PoolTcpEndpoint.java	10 Jan 2003 20:22:37 -0000	1.12
  @@ -122,6 +122,7 @@
       ThreadPoolRunnable listener;
       private volatile boolean running = false;
       private boolean initialized = false;
  +    private boolean reinitializing = false;
       static final int debug=0;
   
       ThreadPool tp;
  @@ -311,28 +312,34 @@
   	if (running) {
   	    tp.shutdown();
   	    running = false;
  -	    try {
  -		// Need to create a connection to unlock the accept();
  -		Socket s;
  -		if (inet == null) {
  -		    s=new Socket("127.0.0.1", port );
  -		}else{
  -		    s=new Socket(inet, port );
  +            if (serverSocket != null) {
  +                closeServerSocket();
  +            }
  +	}
  +    }
  +
  +    protected void closeServerSocket() {
  +        try {
  +            // Need to create a connection to unlock the accept();
  +            Socket s;
  +            if (inet == null) {
  +                s=new Socket("127.0.0.1", port );
  +            }else{
  +                s=new Socket(inet, port );
                       // setting soLinger to a small value will help shutdown the
                       // connection quicker
  -                    s.setSoLinger(true, 0);
  -		}
  -		s.close();
  -	    } catch(Exception e) {
  -                log.error("Caught exception trying to unlock accept.", e);
  -	    }
  -	    try {
  -		serverSocket.close();
  -	    } catch(Exception e) {
  -                log.error("Caught exception trying to close socket.", e);
  -	    }
  -	    serverSocket = null;
  -	}
  +                s.setSoLinger(true, 0);
  +            }
  +            s.close();
  +        } catch(Exception e) {
  +            log.error("Caught exception trying to unlock accept.", e);
  +        }
  +        try {
  +            serverSocket.close();
  +        } catch(Exception e) {
  +            log.error("Caught exception trying to close socket.", e);
  +        }
  +        serverSocket = null;
       }
   
       // -------------------- Private methods
  @@ -362,49 +369,62 @@
           }
           catch (IOException e) {
   
  -            if (running) {
  +            String msg = null;
   
  -                String msg = sm.getString("endpoint.err.nonfatal",
  +            if (running) {
  +                msg = sm.getString("endpoint.err.nonfatal",
                           serverSocket, e);
                   log.error(msg, e);
  +            }
   
  -                if (accepted != null) {
  -                    try {
  -                        accepted.close();
  -                        accepted = null;
  -                    } catch(Exception ex) {
  -                        msg = sm.getString("endpoint.err.nonfatal",
  -                                accepted, ex);
  -                        log.warn(msg, ex);
  -                    }
  +            if (accepted != null) {
  +                try {
  +                    accepted.close();
  +                    accepted = null;
  +                } catch(Exception ex) {
  +                    msg = sm.getString("endpoint.err.nonfatal",
  +                                       accepted, ex);
  +                    log.warn(msg, ex);
                   }
  -                // Restart endpoint when getting an IOException during accept
  -                synchronized (threadSync) {
  +            }
  +
  +            reinitializing = true;
  +            // Restart endpoint when getting an IOException during accept
  +            synchronized (threadSync) {
  +                if (reinitializing) {
  +                    reinitializing = false;
  +                    // 1) Attempt to close server socket
  +                    closeServerSocket();
  +                    initialized = false;
  +                    // 2) Reinit endpoint (recreate server socket)
                       try {
  -                        serverSocket.close();
  -                    } catch(Exception ex) {
  +                        msg = sm.getString("endpoint.warn.reinit");
  +                        log.warn(msg);
  +                        initEndpoint();
  +                    } catch (Throwable t) {
                           msg = sm.getString("endpoint.err.nonfatal",
  -                                serverSocket, ex);
  -                        log.warn(msg, ex);
  +                                           serverSocket, t);
  +                        log.error(msg, t);
                       }
  -                    serverSocket = null;
  -                    try {
  -                        if (inet == null) {
  -                            serverSocket = factory.createSocket(port, backlog);
  -                        } else {
  -                            serverSocket =
  -                                    factory.createSocket(port, backlog, inet);
  +                    // 3) If failed, attempt to restart endpoint
  +                    if (!initialized) {
  +                        msg = sm.getString("endpoint.warn.restart");
  +                        log.warn(msg);
  +                        try {
  +                            stopEndpoint();
  +                            initEndpoint();
  +                            startEndpoint();
  +                        } catch (Throwable t) {
  +                            msg = sm.getString("endpoint.err.fatal",
  +                                               serverSocket, t);
  +                            log.error(msg, t);
  +                        } finally {
  +                            // Current thread is now invalid: kill it
  +                            throw new IllegalStateException
  +                                ("Terminating thread");
                           }
  -                        if (serverTimeout >= 0)
  -                            serverSocket.setSoTimeout(serverTimeout);
  -                    } catch (Throwable t) {
  -                        msg = sm.getString("endpoint.err.fatal",
  -                                serverSocket, t);
  -                        log.error(msg, t);
  -                        stopEndpoint();
                       }
                   }
  -
               }
   
           }
  @@ -509,6 +529,7 @@
   		s = endpoint.acceptSocket();
   	    } catch (Throwable t) {
   		endpoint.log.error("Exception in acceptSocket", t);
  +                throw new IllegalStateException("Terminating thread");
   	    }
   	    if(null != s) {
   		// Continue accepting on another thread...
  
  
  
  1.3       +2 -1      jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/res/LocalStrings.properties
  
  Index: LocalStrings.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/res/LocalStrings.properties,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- LocalStrings.properties	15 May 2002 17:38:37 -0000	1.2
  +++ LocalStrings.properties	10 Jan 2003 20:22:38 -0000	1.3
  @@ -1,4 +1,5 @@
   # net resources
   endpoint.err.fatal=Endpoint {0} shutdown due to exception: {1}
   endpoint.err.nonfatal=Endpoint {0} ignored exception: {1}
  -
  +endpoint.warn.reinit=Reinitializing ServerSocket
  +endpoint.warn.restart=Restarting endpoint
  
  
  
  1.2       +2 -0      jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/res/LocalStrings_fr.properties
  
  Index: LocalStrings_fr.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/res/LocalStrings_fr.properties,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- LocalStrings_fr.properties	5 Nov 2002 09:37:35 -0000	1.1
  +++ LocalStrings_fr.properties	10 Jan 2003 20:22:38 -0000	1.2
  @@ -1,4 +1,6 @@
   # net resources
   endpoint.err.fatal=Le point de contact {0} a �t� �teint suite � l''exception{1}
   endpoint.err.nonfatal=Le point de contact {0} a ignor� l''exception: {1}
  +endpoint.warn.reinit=R�initialisation du ServerSocket
  +endpoint.warn.restart=Red�marrage du point de contact
   
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>