Author: rjung Date: Sun Mar 29 14:17:16 2009 New Revision: 759694 URL: http://svn.apache.org/viewvc?rev=759694&view=rev Log: Fix locking in FastAsyncSocketSender:
Locking in DataSender and the sub class FastAsyncSocketSender uses the same lock, although the reasons for locking are totally independent. - FastAsyncSocketSender only locks for assuring atomicity of internal statistics counter manipulation. - DataSender locks access to sockets and other things. When a node crashes, sharing the same lock leads the request handling threads to block in the replication valve, because the replication sender thread keeps the lock while trying to establish a new connection to the crashed node. This problem stops, as soon as the membership drops the node, but keeps a growing number of connector threads blocked until that happens. Using a separate mutex for the local statistics manipulations will no longer block the request handling threads. Modified: tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/tcp/FastAsyncSocketSender.java Modified: tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/tcp/FastAsyncSocketSender.java URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/tcp/FastAsyncSocketSender.java?rev=759694&r1=759693&r2=759694&view=diff ============================================================================== --- tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/tcp/FastAsyncSocketSender.java (original) +++ tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/tcp/FastAsyncSocketSender.java Sun Mar 29 14:17:16 2009 @@ -92,6 +92,13 @@ private int threadPriority = Thread.NORM_PRIORITY;; + /** + * Separate mutex for our local state. + * We keep the synchronization independent of the synchronization + * in the super class DataSender. + */ + private Object mutex = new Object(); + // ------------------------------------------------------------- Constructor /** @@ -354,7 +361,7 @@ public void sendMessage(ClusterData data) throws java.io.IOException { queue.add(data.getUniqueId(), data); - synchronized (this) { + synchronized (mutex) { inQueueCounter++; if(queueThread != null) queueThread.incQueuedNrOfBytes(data.getMessage().length); @@ -456,15 +463,15 @@ return queuedNrOfBytes; } - protected synchronized void setQueuedNrOfBytes(long queuedNrOfBytes) { + protected void setQueuedNrOfBytes(long queuedNrOfBytes) { this.queuedNrOfBytes = queuedNrOfBytes; } - protected synchronized void incQueuedNrOfBytes(long size) { + protected void incQueuedNrOfBytes(long size) { queuedNrOfBytes += size; } - protected synchronized void decQueuedNrOfBytes(long size) { + protected void decQueuedNrOfBytes(long size) { queuedNrOfBytes -= size; } @@ -562,8 +569,10 @@ .getKey()), x); } } finally { - outQueueCounter++; - decQueuedNrOfBytes(messagesize); + synchronized (sender.mutex) { + outQueueCounter++; + decQueuedNrOfBytes(messagesize); + } } entry = entry.next(); } while (keepRunning && entry != null); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org