You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by fh...@apache.org on 2010/03/25 21:11:33 UTC

svn commit: r927576 - in /tomcat/trunk/java/org/apache/tomcat/util/net: JIoEndpoint.java SocketWrapper.java

Author: fhanik
Date: Thu Mar 25 20:11:32 2010
New Revision: 927576

URL: http://svn.apache.org/viewvc?rev=927576&view=rev
Log:
prevent duplicate threads processing the same socket

Modified:
    tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java
    tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java?rev=927576&r1=927575&r2=927576&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java Thu Mar 25 20:11:32 2010
@@ -33,6 +33,8 @@ import org.apache.tomcat.util.net.Abstra
 import org.apache.tomcat.util.net.NioEndpoint.KeyAttachment;
 import org.apache.tomcat.util.net.NioEndpoint.SocketProcessor;
 
+import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
+
 /**
  * Handle incoming TCP connections.
  *
@@ -228,47 +230,61 @@ public class JIoEndpoint extends Abstrac
         protected SocketStatus status = null;
         
         public SocketProcessor(SocketWrapper<Socket> socket) {
+            if (socket==null) throw new NullPointerException();
             this.socket = socket;
         }
 
         public SocketProcessor(SocketWrapper<Socket> socket, SocketStatus status) {
-            this.socket = socket;
+            this(socket);
             this.status = status;
         }
 
         public void run() {
-        	SocketState state = SocketState.OPEN;
-            // Process the request from this socket
-            if ( (!socket.isInitialized()) && (!setSocketOptions(socket.getSocket())) ) { 
-            	state = SocketState.CLOSED;
-            }
-            socket.setInitialized(true);
-            
-            if ( (state != SocketState.CLOSED) ) {
-                state = (status==null)?handler.process(socket):handler.process(socket,status);
-            }
-            if (state == SocketState.CLOSED) {
-            	// Close socket
-            	if (log.isTraceEnabled()) {
-            		log.trace("Closing socket:"+socket);
-            	}
-                try {
-                    socket.getSocket().close();
-                } catch (IOException e) {
-                    // Ignore
-                }
-            } else if (state == SocketState.OPEN){
-                socket.setKeptAlive(true);
-                socket.access();
-                //keepalive connection
-                //TODO - servlet3 check async status, we may just be in a hold pattern
-                getExecutor().execute(new SocketProcessor(socket));
-            } else if (state == SocketState.LONG) {
-                socket.access();
-                waitingRequests.add(socket);
+            boolean launch = false;
+        	try {
+        	    
+        	    if (!socket.processing.compareAndSet(false, true)) {
+        	        log.error("Unable to process socket. Invalid state.");
+        	        return;
+        	    }
+        	    
+        	    SocketState state = SocketState.OPEN;
+        	    // Process the request from this socket
+        	    if ( (!socket.isInitialized()) && (!setSocketOptions(socket.getSocket())) ) { 
+        	        state = SocketState.CLOSED;
+        	    }
+        	    socket.setInitialized(true);
+
+        	    if ( (state != SocketState.CLOSED) ) {
+        	        state = (status==null)?handler.process(socket):handler.process(socket,status);
+        	    }
+        	    if (state == SocketState.CLOSED) {
+        	        // Close socket
+        	        if (log.isTraceEnabled()) {
+        	            log.trace("Closing socket:"+socket);
+        	        }
+        	        try {
+        	            socket.getSocket().close();
+        	        } catch (IOException e) {
+        	            // Ignore
+        	        }
+        	    } else if (state == SocketState.OPEN){
+        	        socket.setKeptAlive(true);
+        	        socket.access();
+        	        //keepalive connection
+        	        //TODO - servlet3 check async status, we may just be in a hold pattern
+        	        launch = true;
+        	    } else if (state == SocketState.LONG) {
+        	        socket.access();
+        	        waitingRequests.add(socket);
+        	    }
+        	} finally {
+                socket.processing.set(false);
+                if (launch) getExecutor().execute(new SocketProcessor(socket));
+                socket = null;
             }
             // Finish up this request
-            socket = null;
+            
         }
         
     }

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java?rev=927576&r1=927575&r2=927576&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java Thu Mar 25 20:11:32 2010
@@ -16,6 +16,8 @@
  */
 package org.apache.tomcat.util.net;
 
+import java.util.concurrent.atomic.AtomicBoolean;
+
 
 public class SocketWrapper<E> {
     
@@ -30,19 +32,16 @@ public class SocketWrapper<E> {
     protected boolean async = false;
     protected boolean keptAlive = false;
     protected boolean initialized = false;
+    public AtomicBoolean processing = new AtomicBoolean(false);
     
     public SocketWrapper(E socket) {
-        reset(socket);
+        this.socket = socket;
     }
     
     public E getSocket() {
         return socket;
     }
     
-    public void reset(E socket) {
-        this.socket = socket;
-    }
-
     public boolean isAsync() { return async; }
     public void setAsync(boolean async) { this.async = async; }
     public long getLastAccess() { return lastAccess; }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: svn commit: r927576 - in /tomcat/trunk/java/org/apache/tomcat/util/net: JIoEndpoint.java SocketWrapper.java

Posted by Filip Hanik - Dev Lists <de...@hanik.com>.
On 03/25/2010 02:34 PM, Mark Thomas wrote:
> On 25/03/2010 20:11, fhanik@apache.org wrote:
>    
>> Author: fhanik
>> Date: Thu Mar 25 20:11:32 2010
>> New Revision: 927576
>>
>> URL: http://svn.apache.org/viewvc?rev=927576&view=rev
>> Log:
>> prevent duplicate threads processing the same socket
>>
>> Modified:
>>      tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java
>>      tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java
>>
>> Modified: tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java
>> URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java?rev=927576&r1=927575&r2=927576&view=diff
>> ==============================================================================
>> --- tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java (original)
>> +++ tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java Thu Mar 25 20:11:32 2010
>> @@ -33,6 +33,8 @@ import org.apache.tomcat.util.net.Abstra
>>   import org.apache.tomcat.util.net.NioEndpoint.KeyAttachment;
>>   import org.apache.tomcat.util.net.NioEndpoint.SocketProcessor;
>>
>> +import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
>>      
> ??? Auto-complete gremlin?
>    

yup, thanks
Filip
> Mark
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>
>    


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: svn commit: r927576 - in /tomcat/trunk/java/org/apache/tomcat/util/net: JIoEndpoint.java SocketWrapper.java

Posted by Mark Thomas <ma...@apache.org>.
On 25/03/2010 20:11, fhanik@apache.org wrote:
> Author: fhanik
> Date: Thu Mar 25 20:11:32 2010
> New Revision: 927576
> 
> URL: http://svn.apache.org/viewvc?rev=927576&view=rev
> Log:
> prevent duplicate threads processing the same socket
> 
> Modified:
>     tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java
>     tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java
> 
> Modified: tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java
> URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java?rev=927576&r1=927575&r2=927576&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java (original)
> +++ tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java Thu Mar 25 20:11:32 2010
> @@ -33,6 +33,8 @@ import org.apache.tomcat.util.net.Abstra
>  import org.apache.tomcat.util.net.NioEndpoint.KeyAttachment;
>  import org.apache.tomcat.util.net.NioEndpoint.SocketProcessor;
>  
> +import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;

??? Auto-complete gremlin?

Mark



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org