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) &&