You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tr...@apache.org on 2008/03/12 05:17:44 UTC

svn commit: r636193 - in /mina/branches: 1.0/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java 1.1/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java

Author: trustin
Date: Tue Mar 11 21:17:43 2008
New Revision: 636193

URL: http://svn.apache.org/viewvc?rev=636193&view=rev
Log:
Fixed issue: DIRMINA-549 - Inconsistency in managed session set under heavy load* fixed by moving more code under synchronized block


Modified:
    mina/branches/1.0/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java
    mina/branches/1.1/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java

Modified: mina/branches/1.0/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java
URL: http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java?rev=636193&r1=636192&r2=636193&view=diff
==============================================================================
--- mina/branches/1.0/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java (original)
+++ mina/branches/1.0/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java Tue Mar 11 21:17:43 2008
@@ -182,12 +182,12 @@
                 managedSessions.put(serviceAddress, sessions);
                 firstSession = true;
             }
-        }
 
-        // If already registered, ignore.
-        synchronized (sessions) {
-            if (!sessions.add(session)) {
-                return;
+            // If already registered, ignore.
+            synchronized (sessions) {
+                if (!sessions.add(session)) {
+                    return;
+                }
             }
         }
 
@@ -230,7 +230,7 @@
                 return;
             }
 
-            // Try to remove the remaining empty seession set after removal.
+            // Try to remove the remaining empty session set after removal.
             synchronized (sessions) {
                 sessions.remove(session);
                 if (sessions.isEmpty()) {

Modified: mina/branches/1.1/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java
URL: http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java?rev=636193&r1=636192&r2=636193&view=diff
==============================================================================
--- mina/branches/1.1/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java (original)
+++ mina/branches/1.1/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java Tue Mar 11 21:17:43 2008
@@ -156,22 +156,24 @@
     public void fireSessionCreated(IoSession session) {
         SocketAddress serviceAddress = session.getServiceAddress();
 
-        // Get the session set.
-        Set<IoSession> s = new IdentityHashSet<IoSession>();
-        Set<IoSession> sessions = managedSessions.putIfAbsent(serviceAddress,
-                Collections.synchronizedSet(s));
         boolean firstSession;
-
-        if (null == sessions) {
-            sessions = s;
-            firstSession = true;
-        } else {
-            firstSession = false;
-        }
-
-        // If already registered, ignore.
-        if (!sessions.add(session)) {
-            return;
+        Set<IoSession> s = new IdentityHashSet<IoSession>();
+        synchronized (managedSessions) {
+            // Get the session set.
+            Set<IoSession> sessions = managedSessions.putIfAbsent(serviceAddress,
+                    Collections.synchronizedSet(s));
+    
+            if (null == sessions) {
+                sessions = s;
+                firstSession = true;
+            } else {
+                firstSession = false;
+            }
+    
+            // If already registered, ignore.
+            if (!sessions.add(session)) {
+                return;
+            }
         }
 
         // If the first connector session, fire a virtual service activation event.
@@ -201,20 +203,21 @@
     public void fireSessionDestroyed(IoSession session) {
         SocketAddress serviceAddress = session.getServiceAddress();
 
-        // Get the session set.
-        Set<IoSession> sessions = managedSessions.get(serviceAddress);
-        // Ignore if unknown.
-        if (sessions == null) {
-            return;
-        }
-
-        sessions.remove(session);
-
         boolean lastSession = false;
-
-        // Try to remove the remaining empty session set after removal.
-        if (sessions.isEmpty()) {
-            lastSession = managedSessions.remove(serviceAddress, sessions);
+        synchronized (managedSessions) {
+            // Get the session set.
+            Set<IoSession> sessions = managedSessions.get(serviceAddress);
+            // Ignore if unknown.
+            if (sessions == null) {
+                return;
+            }
+    
+            sessions.remove(session);
+    
+            // Try to remove the remaining empty session set after removal.
+            if (sessions.isEmpty()) {
+                lastSession = managedSessions.remove(serviceAddress, sessions);
+            }
         }
 
         // Fire session events.