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 2007/11/03 10:14:01 UTC
svn commit: r591563 - in
/mina/trunk/core/src/main/java/org/apache/mina/filter/traffic:
ReadThrottleFilter.java ReadThrottleFilterChainBuilder.java
WriteThrottleFilter.java
Author: trustin
Date: Sat Nov 3 02:14:00 2007
New Revision: 591563
URL: http://svn.apache.org/viewvc?rev=591563&view=rev
Log:
* Better property naming on ReadThrottleFilter, ReadThrottleFilterChainBuilder and WriteThrottleFilter
* Added TODO marks
Modified:
mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/ReadThrottleFilter.java
mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/ReadThrottleFilterChainBuilder.java
mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/WriteThrottleFilter.java
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=591563&r1=591562&r2=591563&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 Sat Nov 3 02:14:00 2007
@@ -44,27 +44,27 @@
* Returns the maximum amount of data in the buffer of the {@link ExecutorFilter}
* per {@link IoSession}. {@code 0} means 'disabled'.
*/
- int getLocalMaxBufferSize();
+ int getMaxSessionBufferSize();
/**
* Returns the maximum amount of data in the buffer of the {@link ExecutorFilter}
* for all {@link IoSession} whose {@link IoFilterChain} has been configured by
* this builder. {@code 0} means 'disabled'.
*/
- int getGlobalMaxBufferSize();
+ int getMaxGlobalBufferSize();
/**
* Sets the maximum amount of data in the buffer of the {@link ExecutorFilter}
* per {@link IoSession}. Specify {@code 0} or a smaller value to disable.
*/
- void setLocalMaxBufferSize(int localMaxBufferSize);
+ void setMaxSessionBufferSize(int localMaxBufferSize);
/**
* Sets the maximum amount of data in the buffer of the {@link ExecutorFilter}
* for all {@link IoSession} whose {@link IoFilterChain} has been configured by
* this builder. Specify {@code 0} or a smaller value to disable.
*/
- void setGlobalMaxBufferSize(int globalMaxBufferSize);
+ void setMaxGlobalBufferSize(int globalMaxBufferSize);
/**
* Returns the current amount of data in the buffer of the {@link ExecutorFilter}
@@ -73,7 +73,7 @@
int getLocalBufferSize(IoSession session);
/**
- * Returns the current amount of data in the buffer of the {@link ExecuorFilter}
+ * Returns the current amount of data in the buffer of the {@link ExecutorFilter}
* for all {@link IoSession} whose {@link IoFilterChain} has been configured by
* this builder.
*/
Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/ReadThrottleFilterChainBuilder.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/ReadThrottleFilterChainBuilder.java?rev=591563&r1=591562&r2=591563&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/ReadThrottleFilterChainBuilder.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/ReadThrottleFilterChainBuilder.java Sat Nov 3 02:14:00 2007
@@ -72,44 +72,48 @@
*
* @author The Apache MINA Project (dev@mina.apache.org)
* @version $Rev$, $Date$
+ *
+ * TODO Provide per-service limitation
*/
public class ReadThrottleFilterChainBuilder implements IoFilterChainBuilder {
+
+ private static final AtomicInteger globalBufferSize = new AtomicInteger();
+
private final AttributeKey STATE = new AttributeKey(getClass(), "state");
private final IoFilter enterFilter = new EnterFilter();
private final IoFilter exitFilter = new ExitFilter();
- private final AtomicInteger globalBufferSize = new AtomicInteger();
private final MessageSizeEstimator messageSizeEstimator;
- private volatile int localMaxBufferSize;
- private volatile int globalMaxBufferSize;
+ private volatile int maxSessionBufferSize;
+ private volatile int maxGlobalBufferSize;
/**
- * Creates a new instance with 64KB <tt>localMaxBufferSize</tt>,
- * 128MB <tt>globalMaxBufferSize</tt> and a new {@link DefaultMessageSizeEstimator}.
+ * Creates a new instance with 64KB <tt>maxSessionBufferSize</tt>,
+ * 128MB <tt>maxGlobalBufferSize</tt> and a new {@link DefaultMessageSizeEstimator}.
*/
public ReadThrottleFilterChainBuilder() {
- // localMax = 64KB, globalMax = 128MB
+ // 64KB, 128MB
this(65536, 1048576 * 128);
}
/**
- * Creates a new instance with the specified <tt>localMaxBufferSize</tt>,
- * <tt>globalMaxBufferSize</tt> and a new {@link DefaultMessageSizeEstimator}.
+ * Creates a new instance with the specified <tt>maxSessionBufferSize</tt>,
+ * <tt>maxGlobalBufferSize</tt> and a new {@link DefaultMessageSizeEstimator}.
*
*/
- public ReadThrottleFilterChainBuilder(int localMaxBufferSize, int globalMaxBufferSize) {
- this(localMaxBufferSize, globalMaxBufferSize, null);
+ public ReadThrottleFilterChainBuilder(int maxSessionBufferSize, int maxGlobalBufferSize) {
+ this(maxSessionBufferSize, maxGlobalBufferSize, null);
}
/**
- * Creates a new instance with the specified <tt>localMaxBufferSize</tt>,
- * <tt>globalMaxBufferSize</tt> and {@link MessageSizeEstimator}.
+ * Creates a new instance with the specified <tt>maxSessionBufferSize</tt>,
+ * <tt>maxGlobalBufferSize</tt> and {@link MessageSizeEstimator}.
*
- * @param localMaxBufferSize the maximum amount of data in the buffer of
+ * @param maxSessionBufferSize the maximum amount of data in the buffer of
* the {@link ExecutorFilter} per {@link IoSession}.
* Specify {@code 0} or a smaller value to disable.
- * @param globalMaxBufferSize the maximum amount of data in the buffer of
+ * @param maxGlobalBufferSize the maximum amount of data in the buffer of
* the {@link ExecutorFilter} for all {@link IoSession}
* whose {@link IoFilterChain} has been configured by
* this builder.
@@ -118,21 +122,21 @@
* a new {@link DefaultMessageSizeEstimator} is created.
*/
public ReadThrottleFilterChainBuilder(
- int localMaxBufferSize, int globalMaxBufferSize, MessageSizeEstimator messageSizeEstimator) {
+ int maxSessionBufferSize, int maxGlobalBufferSize, MessageSizeEstimator messageSizeEstimator) {
if (messageSizeEstimator == null) {
messageSizeEstimator = new DefaultMessageSizeEstimator();
}
this.messageSizeEstimator = messageSizeEstimator;
- setLocalMaxBufferSize(localMaxBufferSize);
- setGlobalMaxBufferSize(globalMaxBufferSize);
+ setMaxSessionBufferSize(maxSessionBufferSize);
+ setMaxGlobalBufferSize(maxGlobalBufferSize);
}
/**
* Returns the maximum amount of data in the buffer of the {@link ExecutorFilter}
* per {@link IoSession}. {@code 0} means 'disabled'.
*/
- public int getLocalMaxBufferSize() {
- return localMaxBufferSize;
+ public int getMaxSessionBufferSize() {
+ return maxSessionBufferSize;
}
/**
@@ -140,8 +144,8 @@
* for all {@link IoSession} whose {@link IoFilterChain} has been configured by
* this builder. {@code 0} means 'disabled'.
*/
- public int getGlobalMaxBufferSize() {
- return globalMaxBufferSize;
+ public int getMaxGlobalBufferSize() {
+ return maxGlobalBufferSize;
}
/**
@@ -164,7 +168,7 @@
}
synchronized (state) {
- return state.bufferSize;
+ return state.sessionBufferSize;
}
}
@@ -172,11 +176,11 @@
* Sets the maximum amount of data in the buffer of the {@link ExecutorFilter}
* per {@link IoSession}. Specify {@code 0} or a smaller value to disable.
*/
- public void setLocalMaxBufferSize(int localMaxBufferSize) {
- if (localMaxBufferSize < 0) {
- localMaxBufferSize = 0;
+ public void setMaxSessionBufferSize(int maxSessionBufferSize) {
+ if (maxSessionBufferSize < 0) {
+ maxSessionBufferSize = 0;
}
- this.localMaxBufferSize = localMaxBufferSize;
+ this.maxSessionBufferSize = maxSessionBufferSize;
}
/**
@@ -184,11 +188,11 @@
* for all {@link IoSession} whose {@link IoFilterChain} has been configured by
* this builder. Specify {@code 0} or a smaller value to disable.
*/
- public void setGlobalMaxBufferSize(int globalMaxBufferSize) {
- if (globalMaxBufferSize < 0) {
- globalMaxBufferSize = 0;
+ public void setMaxGlobalBufferSize(int maxGlobalBufferSize) {
+ if (maxGlobalBufferSize < 0) {
+ maxGlobalBufferSize = 0;
}
- this.globalMaxBufferSize = globalMaxBufferSize;
+ this.maxGlobalBufferSize = maxGlobalBufferSize;
}
/**
@@ -249,46 +253,46 @@
buildFilterChain(chain.getEntry(AbstractExecutorFilter.class));
}
- private void acquire(IoSession session, int size) {
+ private void enter(IoSession session, int size) {
State state = getState(session);
- int globalBufferSize = this.globalBufferSize.addAndGet(size);
+ int globalBufferSize = ReadThrottleFilterChainBuilder.globalBufferSize.addAndGet(size);
- int globalMaxBufferSize = this.globalMaxBufferSize;
- int localMaxBufferSize = this.localMaxBufferSize;
+ int maxGlobalBufferSize = this.maxGlobalBufferSize;
+ int maxSessionBufferSize = this.maxSessionBufferSize;
synchronized (state) {
- int bufferSize = (state.bufferSize += size);
- if ((localMaxBufferSize != 0 && bufferSize >= localMaxBufferSize) ||
- (globalMaxBufferSize != 0 && globalBufferSize >= globalMaxBufferSize)) {
+ int bufferSize = (state.sessionBufferSize += size);
+ if ((maxSessionBufferSize != 0 && bufferSize >= maxSessionBufferSize) ||
+ (maxGlobalBufferSize != 0 && globalBufferSize >= maxGlobalBufferSize)) {
session.suspendRead();
state.suspendedRead = true;
}
}
}
- private void release(IoSession session, int size) {
+ private void exit(IoSession session, int size) {
State state = getState(session);
- int globalBufferSize = this.globalBufferSize.addAndGet(-size);
+ int globalBufferSize = ReadThrottleFilterChainBuilder.globalBufferSize.addAndGet(-size);
if (globalBufferSize < 0) {
- this.globalBufferSize.set(0);
+ ReadThrottleFilterChainBuilder.globalBufferSize.set(0);
throw new IllegalStateException("globalBufferSize < 0");
}
- int globalMaxBufferSize = this.globalMaxBufferSize;
- int localMaxBufferSize = this.localMaxBufferSize;
+ int maxGlobalBufferSize = this.maxGlobalBufferSize;
+ int maxSessionBufferSize = this.maxSessionBufferSize;
synchronized (state) {
- int bufferSize = (state.bufferSize -= size);
+ int bufferSize = (state.sessionBufferSize -= size);
if (bufferSize < 0) {
- state.bufferSize = 0;
- throw new IllegalStateException("bufferSize < 0");
+ state.sessionBufferSize = 0;
+ throw new IllegalStateException("sessionBufferSize < 0");
}
if (state.suspendedRead &&
- (localMaxBufferSize == 0 || bufferSize < localMaxBufferSize) &&
- (globalMaxBufferSize == 0 || globalBufferSize < globalMaxBufferSize)) {
+ (maxSessionBufferSize == 0 || bufferSize < maxSessionBufferSize) &&
+ (maxGlobalBufferSize == 0 || globalBufferSize < maxGlobalBufferSize)) {
session.resumeRead();
state.suspendedRead = false;
}
@@ -328,7 +332,7 @@
@Override
public void messageReceived(
NextFilter nextFilter, IoSession session, Object message) throws Exception {
- acquire(session, messageSizeEstimator.estimateSize(message));
+ enter(session, messageSizeEstimator.estimateSize(message));
nextFilter.messageReceived(session, message);
}
@@ -336,33 +340,33 @@
return ReadThrottleFilterChainBuilder.this.getGlobalBufferSize();
}
- public int getGlobalMaxBufferSize() {
- return ReadThrottleFilterChainBuilder.this.getGlobalMaxBufferSize();
+ public int getMaxGlobalBufferSize() {
+ return ReadThrottleFilterChainBuilder.this.getMaxGlobalBufferSize();
}
public int getLocalBufferSize(IoSession session) {
return ReadThrottleFilterChainBuilder.this.getLocalBufferSize(session);
}
- public int getLocalMaxBufferSize() {
- return ReadThrottleFilterChainBuilder.this.getLocalMaxBufferSize();
+ public int getMaxSessionBufferSize() {
+ return ReadThrottleFilterChainBuilder.this.getMaxSessionBufferSize();
}
public MessageSizeEstimator getMessageSizeEstimator() {
return ReadThrottleFilterChainBuilder.this.getMessageSizeEstimator();
}
- public void setGlobalMaxBufferSize(int globalMaxBufferSize) {
- ReadThrottleFilterChainBuilder.this.setGlobalMaxBufferSize(globalMaxBufferSize);
+ public void setMaxGlobalBufferSize(int maxGlobalBufferSize) {
+ ReadThrottleFilterChainBuilder.this.setMaxGlobalBufferSize(maxGlobalBufferSize);
}
- public void setLocalMaxBufferSize(int localMaxBufferSize) {
- ReadThrottleFilterChainBuilder.this.setLocalMaxBufferSize(localMaxBufferSize);
+ public void setMaxSessionBufferSize(int maxSessionBufferSize) {
+ ReadThrottleFilterChainBuilder.this.setMaxSessionBufferSize(maxSessionBufferSize);
}
@Override
public String toString() {
- return String.valueOf(getGlobalBufferSize()) + '/' + getGlobalMaxBufferSize();
+ return String.valueOf(getGlobalBufferSize()) + '/' + getMaxGlobalBufferSize();
}
}
@@ -381,18 +385,18 @@
@Override
public void messageReceived(
NextFilter nextFilter, IoSession session, Object message) throws Exception {
- release(session, messageSizeEstimator.estimateSize(message));
+ exit(session, messageSizeEstimator.estimateSize(message));
nextFilter.messageReceived(session, message);
}
@Override
public String toString() {
- return String.valueOf(getGlobalBufferSize()) + '/' + getGlobalMaxBufferSize();
+ return String.valueOf(getGlobalBufferSize()) + '/' + getMaxGlobalBufferSize();
}
}
private static class State {
- private int bufferSize;
+ private int sessionBufferSize;
private boolean suspendedRead;
}
}
Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/WriteThrottleFilter.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/WriteThrottleFilter.java?rev=591563&r1=591562&r2=591563&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/WriteThrottleFilter.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/traffic/WriteThrottleFilter.java Sat Nov 3 02:14:00 2007
@@ -32,14 +32,18 @@
* {@link OutOfMemoryError} under heavy load.
* <p>
* This filter will automatically enforce the specified {@link WriteThrottlePolicy}
- * when the {@link IoSession#getScheduledWriteBytes() localScheduledWriteBytes},
- * {@link IoSession#getScheduledWriteMessages() localScheduledWriteMessages},
- * {@link IoService#getScheduledWriteBytes() globalScheduledWriteBytes} or
- * {@link IoService#getScheduledWriteMessages() globalScheduledWriteMessages}
+ * when the {@link IoSession#getScheduledWriteBytes() sessionScheduledWriteBytes},
+ * {@link IoSession#getScheduledWriteMessages() sessionScheduledWriteMessages},
+ * {@link IoService#getScheduledWriteBytes() serviceScheduledWriteBytes} or
+ * {@link IoService#getScheduledWriteMessages() serviceScheduledWriteMessages}
* exceeds the specified limit values.
+ * <p>
+ * Please add this filter at the end of the filter chain.
* @author The Apache MINA Project (dev@mina.apache.org)
* @version $Rev$, $Date$
+ *
+ * TODO provide global limitation
*/
public class WriteThrottleFilter extends IoFilterAdapter {
@@ -51,10 +55,10 @@
private volatile WriteThrottlePolicy policy;
- private volatile int localMaxScheduledWriteMessages;
- private volatile long localMaxScheduledWriteBytes;
- private volatile int globalMaxScheduledWriteMessages;
- private volatile long globalMaxScheduledWriteBytes;
+ private volatile int maxSessionScheduledWriteMessages;
+ private volatile long maxSessionScheduledWriteBytes;
+ private volatile int maxServiceScheduledWriteMessages;
+ private volatile long maxServiceScheduledWriteBytes;
/**
* Creates a new instance with the default policy
@@ -77,10 +81,10 @@
* ({@link WriteThrottlePolicy#LOG}) and the specified limit values.
*/
public WriteThrottleFilter(
- int localMaxScheduledWriteMessages, long localMaxScheduledWriteBytes,
+ int maxSessionScheduledWriteMessages, long maxSessionScheduledWriteBytes,
int globalMaxScheduledWriteMessages, long globalMaxScheduledWriteBytes) {
this(WriteThrottlePolicy.LOG,
- localMaxScheduledWriteMessages, localMaxScheduledWriteBytes,
+ maxSessionScheduledWriteMessages, maxSessionScheduledWriteBytes,
globalMaxScheduledWriteMessages, globalMaxScheduledWriteBytes);
}
@@ -90,14 +94,14 @@
*/
public WriteThrottleFilter(
WriteThrottlePolicy policy,
- int localMaxScheduledWriteMessages, long localMaxScheduledWriteBytes,
- int globalMaxScheduledWriteMessages, long globalMaxScheduledWriteBytes) {
+ int maxSessionScheduledWriteMessages, long maxSessionScheduledWriteBytes,
+ int maxServiceScheduledWriteMessages, long maxServiceScheduledWriteBytes) {
setPolicy(policy);
- setLocalMaxScheduledWriteMessages(localMaxScheduledWriteMessages);
- setLocalMaxScheduledWriteBytes(localMaxScheduledWriteBytes);
- setGlobalMaxScheduledWriteMessages(globalMaxScheduledWriteMessages);
- setGlobalMaxScheduledWriteBytes(globalMaxScheduledWriteBytes);
+ setMaxSessionScheduledWriteMessages(maxSessionScheduledWriteMessages);
+ setMaxSessionScheduledWriteBytes(maxSessionScheduledWriteBytes);
+ setMaxServiceScheduledWriteMessages(maxServiceScheduledWriteMessages);
+ setMaxServiceScheduledWriteBytes(maxServiceScheduledWriteBytes);
}
public WriteThrottlePolicy getPolicy() {
@@ -111,48 +115,48 @@
this.policy = policy;
}
- public int getLocalMaxScheduledWriteMessages() {
- return localMaxScheduledWriteMessages;
+ public int getMaxSessionScheduledWriteMessages() {
+ return maxSessionScheduledWriteMessages;
}
- public void setLocalMaxScheduledWriteMessages(int localMaxScheduledWriteMessages) {
- if (localMaxScheduledWriteMessages < 0) {
- localMaxScheduledWriteMessages = 0;
+ public void setMaxSessionScheduledWriteMessages(int maxSessionScheduledWriteMessages) {
+ if (maxSessionScheduledWriteMessages < 0) {
+ maxSessionScheduledWriteMessages = 0;
}
- this.localMaxScheduledWriteMessages = localMaxScheduledWriteMessages;
+ this.maxSessionScheduledWriteMessages = maxSessionScheduledWriteMessages;
}
- public long getLocalMaxScheduledWriteBytes() {
- return localMaxScheduledWriteBytes;
+ public long getMaxSessionScheduledWriteBytes() {
+ return maxSessionScheduledWriteBytes;
}
- public void setLocalMaxScheduledWriteBytes(long localMaxScheduledWriteBytes) {
- if (localMaxScheduledWriteBytes < 0) {
- localMaxScheduledWriteBytes = 0;
+ public void setMaxSessionScheduledWriteBytes(long maxSessionScheduledWriteBytes) {
+ if (maxSessionScheduledWriteBytes < 0) {
+ maxSessionScheduledWriteBytes = 0;
}
- this.localMaxScheduledWriteBytes = localMaxScheduledWriteBytes;
+ this.maxSessionScheduledWriteBytes = maxSessionScheduledWriteBytes;
}
- public int getGlobalMaxScheduledWriteMessages() {
- return globalMaxScheduledWriteMessages;
+ public int getMaxServiceScheduledWriteMessages() {
+ return maxServiceScheduledWriteMessages;
}
- public void setGlobalMaxScheduledWriteMessages(int globalMaxScheduledWriteMessages) {
- if (globalMaxScheduledWriteMessages < 0) {
- globalMaxScheduledWriteMessages = 0;
+ public void setMaxServiceScheduledWriteMessages(int maxServiceScheduledWriteMessages) {
+ if (maxServiceScheduledWriteMessages < 0) {
+ maxServiceScheduledWriteMessages = 0;
}
- this.globalMaxScheduledWriteMessages = globalMaxScheduledWriteMessages;
+ this.maxServiceScheduledWriteMessages = maxServiceScheduledWriteMessages;
}
- public long getGlobalMaxScheduledWriteBytes() {
- return globalMaxScheduledWriteBytes;
+ public long getMaxServiceScheduledWriteBytes() {
+ return maxServiceScheduledWriteBytes;
}
- public void setGlobalMaxScheduledWriteBytes(long globalMaxScheduledWriteBytes) {
- if (globalMaxScheduledWriteBytes < 0) {
- globalMaxScheduledWriteBytes = 0;
+ public void setMaxServiceScheduledWriteBytes(long maxServiceScheduledWriteBytes) {
+ if (maxServiceScheduledWriteBytes < 0) {
+ maxServiceScheduledWriteBytes = 0;
}
- this.globalMaxScheduledWriteBytes = globalMaxScheduledWriteBytes;
+ this.maxServiceScheduledWriteBytes = maxServiceScheduledWriteBytes;
}
@Override
@@ -189,10 +193,10 @@
return true;
}
- int lmswm = localMaxScheduledWriteMessages;
- long lmswb = localMaxScheduledWriteBytes;
- int gmswm = globalMaxScheduledWriteMessages;
- long gmswb = globalMaxScheduledWriteBytes;
+ int lmswm = maxSessionScheduledWriteMessages;
+ long lmswb = maxSessionScheduledWriteBytes;
+ int gmswm = maxServiceScheduledWriteMessages;
+ long gmswb = maxServiceScheduledWriteBytes;
return (lmswm == 0 || session.getScheduledWriteMessages() < lmswm) &&
(lmswb == 0 || session.getScheduledWriteBytes() < lmswb) &&
@@ -270,10 +274,10 @@
}
private String getMessage(IoSession session) {
- int lmswm = localMaxScheduledWriteMessages;
- long lmswb = localMaxScheduledWriteBytes;
- int gmswm = globalMaxScheduledWriteMessages;
- long gmswb = globalMaxScheduledWriteBytes;
+ int lmswm = maxSessionScheduledWriteMessages;
+ long lmswb = maxSessionScheduledWriteBytes;
+ int gmswm = maxServiceScheduledWriteMessages;
+ long gmswb = maxServiceScheduledWriteBytes;
StringBuilder buf = new StringBuilder(512);
buf.append("Write requests flooded - local: ");