You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by be...@apache.org on 2007/01/19 10:13:11 UTC

svn commit: r497748 - in /db/derby/code/trunk/java/drda/org/apache/derby/impl/drda: ClientThread.java DDMReader.java DRDAConnThread.java DRDAProtocolException.java

Author: bernt
Date: Fri Jan 19 01:13:10 2007
New Revision: 497748

URL: http://svn.apache.org/viewvc?view=rev&rev=497748
Log:
DERBY-2166 Implement proper handling of SocketTimeoutException in DRDAConnThread. Submitted by Bernt M. Johnsen

Modified:
    db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/ClientThread.java
    db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DDMReader.java
    db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java
    db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAProtocolException.java

Modified: db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/ClientThread.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/ClientThread.java?view=diff&rev=497748&r1=497747&r2=497748
==============================================================================
--- db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/ClientThread.java (original)
+++ db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/ClientThread.java Fri Jan 19 01:13:10 2007
@@ -62,8 +62,9 @@
 						}
 					 );
 							clientSocket.setKeepAlive(parent.getKeepAlive());
-					//set time out					
-					//this looks highly suspect.  Why does timeSlice setSoTimeout?		
+
+					// Set time out: Stops DDMReader.fill() from
+					// waiting indefinitely when timeSlice is set.
 					if (timeSlice != 0)
 						clientSocket.setSoTimeout(timeSlice);
 				} catch (PrivilegedActionException e) {

Modified: db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DDMReader.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DDMReader.java?view=diff&rev=497748&r1=497747&r2=497748
==============================================================================
--- db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DDMReader.java (original)
+++ db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DDMReader.java Fri Jan 19 01:13:10 2007
@@ -1896,12 +1896,16 @@
 			try {
 				actualBytesRead = inputStream.read (
 				  buffer, count, buffer.length - count);
-			}
-			catch (java.io.IOException ioe) {
-				agent.markCommunicationsFailure ("DDMReader.fill()",
-				  "InputStream.read()", ioe.getMessage(), "*");
-			}
-			finally {
+			} catch (java.net.SocketTimeoutException ste) {
+
+                // Transport the timeout out through the layers. This
+                // exception is caught in DRDAConnThread.run();
+                throw new DRDASocketTimeoutException(agent);
+
+			} catch (java.io.IOException ioe) {
+                agent.markCommunicationsFailure("DDMReader.fill()",
+                                                "InputStream.read()", ioe.getMessage(), "*");
+			} finally {
 				if ((dssTrace != null) && dssTrace.isComBufferTraceOn())
 				  dssTrace.writeComBufferData (buffer,
 				                               count,
@@ -1917,8 +1921,8 @@
 				totalBytesRead += actualBytesRead;
 			}
 
-		}
-		while ((totalBytesRead < minimumBytesNeeded) && (actualBytesRead != -1));
+		} while ((totalBytesRead < minimumBytesNeeded) && (actualBytesRead != -1));
+
 		if (actualBytesRead == -1) 
 		{
 			if (totalBytesRead < minimumBytesNeeded) 

Modified: db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java?view=diff&rev=497748&r1=497747&r2=497748
==============================================================================
--- db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java (original)
+++ db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java Fri Jan 19 01:13:10 2007
@@ -272,7 +272,14 @@
 						long currentTimeSlice;
 
 						do {
-							processCommands();
+                            try {
+                                processCommands();
+                            } catch (DRDASocketTimeoutException ste) {
+                                // Just ignore the exception. This was
+                                // a timeout on the read call in
+                                // DDMReader.fill(), which will happen
+                                // only when timeSlice is set.
+                            }
 							currentTimeSlice = getTimeSlice();
 						} while ((currentTimeSlice == 0)  || 
 							(System.currentTimeMillis() - timeStart < currentTimeSlice));

Modified: db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAProtocolException.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAProtocolException.java?view=diff&rev=497748&r1=497747&r2=497748
==============================================================================
--- db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAProtocolException.java (original)
+++ db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAProtocolException.java Fri Jan 19 01:13:10 2007
@@ -101,6 +101,7 @@
 
 	protected static String DRDA_Disconnect=	   "DRDA_Disconnect";
 	protected static String DRDA_AgentError=	   "DRDA_AgentError";
+    protected static String DRDA_Timeout=          "DRDA_Timeout";
 
 	static {
 	/* Create the errorInfoTable
@@ -201,6 +202,14 @@
 							 NO_ASSOC_ERRCD,
 							 false));
 
+
+	errorInfoTable.put(DRDA_Timeout,
+			   new DRDAProtocolExceptionInfo(
+							 0,
+							 0,
+							 NO_ASSOC_ERRCD,
+							 false));
+
 	}
 		
 	
@@ -387,7 +396,13 @@
 }
 
 
-
-
-
-
+/**
+ * Class used to transport that fact that we had a timeout and should
+ * *NOT* disconnect the connection.
+ * See DRDAConnThread.run()
+ */
+class DRDASocketTimeoutException extends DRDAProtocolException {
+    DRDASocketTimeoutException(DRDAConnThread t) {
+        super(DRDA_Timeout,t,0,0);
+    }
+}