Author: trustin
Date: Sun Nov 11 06:56:59 2007
New Revision: 593899

URL: http://svn.apache.org/viewvc?rev=593899&view=rev
Log:
Related issue: DIRMINA-473 (ReadThrottleFilter throws IllegalStateException)
* Added more sanity check to track down the problem more precisely

Modified:
    
mina/trunk/core/src/main/java/org/apache/mina/filter/executor/IoEventQueueThrottle.java
    
mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/ReadThrottleFilter.java

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/filter/executor/IoEventQueueThrottle.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/executor/IoEventQueueThrottle.java?rev=593899&r1=593898&r2=593899&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/filter/executor/IoEventQueueThrottle.java
 (original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/filter/executor/IoEventQueueThrottle.java
 Sun Nov 11 06:56:59 2007
@@ -81,7 +81,7 @@
     }
     
     public void offered(ThreadPoolExecutor executor, IoEvent event) {
-        int eventSize = getEventSizeEstimator().estimateSize(event);
+        int eventSize = estimateSize(event);
         int currentCounter = counter.addAndGet(eventSize);
         logState();
 
@@ -89,10 +89,14 @@
             block();
         }
     }
-    
+
     public void polled(ThreadPoolExecutor executor, IoEvent event) {
-        int eventSize = getEventSizeEstimator().estimateSize(event);
+        int eventSize = estimateSize(event);
         int currentCounter = counter.addAndGet(-eventSize);
+        if (currentCounter < 0) {
+            throw new IllegalStateException("counter: " + currentCounter);
+        }
+        
         logState();
 
         if (currentCounter < threshold) {
@@ -100,6 +104,16 @@
         }
     }
 
+    private int estimateSize(IoEvent event) {
+        int size = getEventSizeEstimator().estimateSize(event);
+        if (size < 0) {
+            throw new IllegalStateException(
+                    IoEventSizeEstimator.class.getSimpleName() + " returned " +
+                    "a negative value (" + size + "): " + event);
+        }
+        return size;
+    }
+    
     private void logState() {
         if (logger.isDebugEnabled()) {
             logger.debug(Thread.currentThread().getName() + " state: " + 
counter.get() + " / " + getThreshold());

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/ReadThrottleFilter.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/ReadThrottleFilter.java?rev=593899&r1=593898&r2=593899&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/ReadThrottleFilter.java
 (original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/ReadThrottleFilter.java
 Sun Nov 11 06:56:59 2007
@@ -100,10 +100,6 @@
         return serviceBufferSize.addAndGet(increment);
     }
     
-    private static void resetServiceBufferSize(IoService service) {
-        serviceBufferSizes.remove(service);
-    }
-    
     private final AttributeKey STATE =
         new AttributeKey(ReadThrottleFilter.class, "state");
 
@@ -313,7 +309,7 @@
     @Override
     public void messageReceived(
             NextFilter nextFilter, IoSession session, Object message) throws 
Exception {
-        exit(session, messageSizeEstimator.estimateSize(message));
+        exit(session, estimateSize(message));
         nextFilter.messageReceived(session, message);
     }
 
@@ -358,10 +354,20 @@
         @Override
         public void messageReceived(
                 NextFilter nextFilter, IoSession session, Object message) 
throws Exception {
-            enter(session, messageSizeEstimator.estimateSize(message));
+            enter(session, estimateSize(message));
             nextFilter.messageReceived(session, message);
         }
     }
+    
+    private int estimateSize(Object message) {
+        int size = messageSizeEstimator.estimateSize(message);
+        if (size < 0) {
+            throw new IllegalStateException(
+                    MessageSizeEstimator.class.getSimpleName() + " returned " +
+                    "a negative value (" + size + "): " + message);
+        }
+        return size;
+    }
 
     private void enter(IoSession session, int size) {
         State state = getState(session);
@@ -431,12 +437,12 @@
 
         int globalBufferSize = 
ReadThrottleFilter.globalBufferSize.addAndGet(-size);
         if (globalBufferSize < 0) {
-            ReadThrottleFilter.globalBufferSize.set(0);
+            throw new IllegalStateException("globalBufferSize: " + 
globalBufferSize);
         }
         
         int serviceBufferSize = 
increaseServiceBufferSize(session.getService(), -size);
         if (serviceBufferSize < 0) {
-            resetServiceBufferSize(session.getService());
+            throw new IllegalStateException("serviceBufferSize: " + 
serviceBufferSize);
         }
 
         int maxGlobalBufferSize = this.maxGlobalBufferSize;
@@ -449,7 +455,7 @@
         synchronized (state) {
             sessionBufferSize = (state.sessionBufferSize -= size);
             if (sessionBufferSize < 0) {
-                state.sessionBufferSize = sessionBufferSize = 0;
+                throw new IllegalStateException("sessionBufferSize: " + 
sessionBufferSize);
             }
             if ((maxGlobalBufferSize == 0 || globalBufferSize < 
maxGlobalBufferSize) &&
                 (maxServiceBufferSize == 0 || serviceBufferSize < 
maxServiceBufferSize) &&


Reply via email to