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 ka...@apache.org on 2006/09/15 09:52:19 UTC

svn commit: r446538 - in /db/derby/code/trunk/java/drda/org/apache/derby/impl/drda: DRDAConnThread.java NetworkServerControlImpl.java

Author: kahatlen
Date: Fri Sep 15 00:52:18 2006
New Revision: 446538

URL: http://svn.apache.org/viewvc?view=rev&rev=446538
Log:
DERBY-1326 (partial) Network server may abandon sessions when Derby
system is shutdown and this causes intermittent hangs in the client

Two small cleanups:

  Make NetworkServerControlImpl.startNetworkServer() remove the
  sessions it closes from sessionTable. Also, synchronize on runQueue
  to prevent modifications while the queue is traversed.

  Invoke closeSession() and close() in a finally clause in
  DRDAConnThread.handleException() to ensure proper closing of the
  session when an unexpected error happens.

Modified:
    db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java
    db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/NetworkServerControlImpl.java

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=446538&r1=446537&r2=446538
==============================================================================
--- 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 Sep 15 00:52:18 2006
@@ -7491,46 +7491,46 @@
 	 */
 	private void handleException(Exception e)
 	{
-		String dbname = null;
-		if (database != null)
-			dbname = database.dbName;
-		
-		// protocol error - write error message and close session
-		if (e instanceof DRDAProtocolException)
-		{
-			try
-			{
-				DRDAProtocolException de = (DRDAProtocolException) e;
-				println2Log(dbname,session.drdaID, 
-							e.getMessage());
+		try {
+			if (e instanceof DRDAProtocolException) {
+				// protocol error - write error message
+				sendProtocolException((DRDAProtocolException) e);
+			} else {
+				// something unexpected happened
+				sendUnexpectedException(e);
 				server.consoleExceptionPrintTrace(e);
-				reader.clearBuffer();
-				de.write(writer);
-				finalizeChain();
-				closeSession();
-				close();
-			}
-			catch (DRDAProtocolException ioe)
-			{
-				// There may be an IO exception in the write.
-				println2Log(dbname,session.drdaID, 
-							e.getMessage());
-				server.consoleExceptionPrintTrace(ioe);
-				closeSession();
-				close();
 			}
-		}
-		else
-		{
-			// something unexpected happened so let's kill this thread
-			sendUnexpectedException(e);
-
-			server.consoleExceptionPrintTrace(e);
+		} finally {
+			// always close the session and stop the thread after handling
+			// these exceptions
 			closeSession();
 			close();
 		}
 	}
 	
+	/**
+	 * Notice the client about a protocol error.
+	 *
+	 * @param de <code>DRDAProtocolException</code> to be sent
+	 */
+	private void sendProtocolException(DRDAProtocolException de) {
+		String dbname = null;
+		if (database != null) {
+			dbname = database.dbName;
+		}
+
+		try {
+			println2Log(dbname, session.drdaID, de.getMessage());
+			server.consoleExceptionPrintTrace(de);
+			reader.clearBuffer();
+			de.write(writer);
+			finalizeChain();
+		} catch (DRDAProtocolException ioe) {
+			// There may be an IO exception in the write.
+			println2Log(dbname, session.drdaID, de.getMessage());
+			server.consoleExceptionPrintTrace(ioe);
+		}
+	}
 
 	/**
 	 * Send unpexpected error to the client

Modified: db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/NetworkServerControlImpl.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/NetworkServerControlImpl.java?view=diff&rev=446538&r1=446537&r2=446538
==============================================================================
--- db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/NetworkServerControlImpl.java (original)
+++ db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/NetworkServerControlImpl.java Fri Sep 15 00:52:18 2006
@@ -743,9 +743,14 @@
 					// exception), so we need to clean up first.
 
 						// Close and remove sessions on runQueue.
-						for (int i = 0; i < runQueue.size(); i++)
-							((Session)runQueue.get(i)).close();
-						runQueue.clear();
+						synchronized (runQueue) {
+							for (int i = 0; i < runQueue.size(); i++) {
+								Session s = (Session) runQueue.get(i);
+								s.close();
+								removeFromSessionTable(s.getConnNum());
+							}
+							runQueue.clear();
+						}
 
 						// Close and remove DRDAConnThreads on threadList.
 						for (int i = 0; i < threadList.size(); i++)