You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2006/06/04 17:01:39 UTC
svn commit: r411576 - in /tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11:
InternalAprInputBuffer.java InternalAprOutputBuffer.java
Author: remm
Date: Sun Jun 4 08:01:39 2006
New Revision: 411576
URL: http://svn.apache.org/viewvc?rev=411576&view=rev
Log:
- With Comet support, it is necessary to optimize the amount of memory used by individual
processors. This removes most of the buffers that are being used, without reducing performance
in many cases.
- Note: I'm not sure the algorithm in InternalAprInputBuffer.nextRequest, which is used when
pipelining, is correct. It also could use free space in the buffer more efficiently when trimming
it.
Modified:
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalAprInputBuffer.java
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java
Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalAprInputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalAprInputBuffer.java?rev=411576&r1=411575&r2=411576&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalAprInputBuffer.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalAprInputBuffer.java Sun Jun 4 08:01:39 2006
@@ -55,14 +55,12 @@
this.request = request;
headers = request.getMimeHeaders();
- headerBuffer1 = new byte[headerBufferSize];
- headerBuffer2 = new byte[headerBufferSize];
- bodyBuffer = new byte[headerBufferSize];
- buf = headerBuffer1;
- bbuf = ByteBuffer.allocateDirect(headerBufferSize);
-
- headerBuffer = new char[headerBufferSize];
- ascbuf = headerBuffer;
+ buf = new byte[headerBufferSize];
+ if (headerBufferSize < (8 * 1024)) {
+ bbuf = ByteBuffer.allocateDirect(6 * 1500);
+ } else {
+ bbuf = ByteBuffer.allocateDirect((headerBufferSize / 1500 + 1) * 1500);
+ }
inputStreamInputBuffer = new SocketInputBuffer();
@@ -126,12 +124,6 @@
/**
- * Pointer to the US-ASCII header buffer.
- */
- protected char[] ascbuf;
-
-
- /**
* Last valid byte.
*/
protected int lastValid;
@@ -144,27 +136,10 @@
/**
- * HTTP header buffer no 1.
- */
- protected byte[] headerBuffer1;
-
-
- /**
- * HTTP header buffer no 2.
- */
- protected byte[] headerBuffer2;
-
-
- /**
- * HTTP body buffer.
+ * Pos of the end of the header in the buffer, which is also the
+ * start of the body.
*/
- protected byte[] bodyBuffer;
-
-
- /**
- * US-ASCII header buffer.
- */
- protected char[] headerBuffer;
+ protected int end;
/**
@@ -313,7 +288,6 @@
request.recycle();
socket = 0;
- buf = headerBuffer1;
lastValid = 0;
pos = 0;
lastActiveFilter = -1;
@@ -334,20 +308,19 @@
// Recycle Request object
request.recycle();
- // Determine the header buffer used for next request
- byte[] newHeaderBuf = null;
- if (buf == headerBuffer1) {
- newHeaderBuf = headerBuffer2;
- } else {
- newHeaderBuf = headerBuffer1;
+ //System.out.println("LV-pos: " + (lastValid - pos));
+ // Copy leftover bytes to the beginning of the buffer
+ if (lastValid - pos > 0) {
+ int npos = 0;
+ int opos = pos;
+ while (lastValid - opos > opos - npos) {
+ System.arraycopy(buf, opos, buf, npos, opos - npos);
+ npos += pos;
+ opos += pos;
+ }
+ System.arraycopy(buf, opos, buf, npos, lastValid - opos);
}
-
- // Copy leftover bytes from buf to newHeaderBuf
- System.arraycopy(buf, pos, newHeaderBuf, 0, lastValid - pos);
-
- // Swap buffers
- buf = newHeaderBuf;
-
+
// Recycle filters
for (int i = 0; i <= lastActiveFilter; i++) {
activeFilters[i].recycle();
@@ -479,11 +452,9 @@
throw new EOFException(sm.getString("iib.eof.error"));
}
- ascbuf[pos] = (char) buf[pos];
-
if (buf[pos] == Constants.SP) {
space = true;
- request.method().setChars(ascbuf, start, pos - start);
+ request.method().setBytes(buf, start, pos - start);
}
pos++;
@@ -554,8 +525,6 @@
throw new EOFException(sm.getString("iib.eof.error"));
}
- ascbuf[pos] = (char) buf[pos];
-
if (buf[pos] == Constants.CR) {
end = pos;
} else if (buf[pos] == Constants.LF) {
@@ -569,7 +538,7 @@
}
if ((end - start) > 0) {
- request.protocol().setChars(ascbuf, start, end - start);
+ request.protocol().setBytes(buf, start, end - start);
} else {
request.protocol().setString("");
}
@@ -589,6 +558,7 @@
}
parsingHeader = false;
+ end = pos;
}
@@ -651,15 +621,13 @@
if (buf[pos] == Constants.COLON) {
colon = true;
- headerValue = headers.addValue(ascbuf, start, pos - start);
+ headerValue = headers.addValue(buf, start, pos - start);
}
chr = buf[pos];
if ((chr >= Constants.A) && (chr <= Constants.Z)) {
buf[pos] = (byte) (chr - Constants.LC_OFFSET);
}
- ascbuf[pos] = (char) buf[pos];
-
pos++;
}
@@ -793,8 +761,7 @@
}
bbuf.clear();
- nRead = Socket.recvbb
- (socket, 0, buf.length - lastValid);
+ nRead = Socket.recvbb(socket, 0, buf.length - lastValid);
if (nRead > 0) {
bbuf.limit(nRead);
bbuf.get(buf, pos, nRead);
@@ -809,16 +776,21 @@
} else {
- buf = bodyBuffer;
- pos = 0;
- lastValid = 0;
+ if (buf.length - end < 4500) {
+ // In this case, the request header was really large, so we allocate a
+ // brand new one; the old one will get GCed when subsequent requests
+ // clear all references
+ buf = new byte[buf.length];
+ end = 0;
+ }
+ pos = end;
+ lastValid = pos;
bbuf.clear();
- nRead = Socket.recvbb
- (socket, 0, buf.length);
+ nRead = Socket.recvbb(socket, 0, buf.length - lastValid);
if (nRead > 0) {
bbuf.limit(nRead);
- bbuf.get(buf, 0, nRead);
- lastValid = nRead;
+ bbuf.get(buf, pos, nRead);
+ lastValid = pos + nRead;
} else {
throw new IOException(sm.getString("iib.failedread"));
}
Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java?rev=411576&r1=411575&r2=411576&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java Sun Jun 4 08:01:39 2006
@@ -62,10 +62,12 @@
this.response = response;
headers = response.getMimeHeaders();
- headerBuffer = new byte[headerBufferSize];
- buf = headerBuffer;
-
- bbuf = ByteBuffer.allocateDirect((headerBufferSize / 1500 + 1) * 1500);
+ buf = new byte[headerBufferSize];
+ if (headerBufferSize < (8 * 1024)) {
+ bbuf = ByteBuffer.allocateDirect(6 * 1500);
+ } else {
+ bbuf = ByteBuffer.allocateDirect((headerBufferSize / 1500 + 1) * 1500);
+ }
outputStreamOutputBuffer = new SocketOutputBuffer();
@@ -120,7 +122,7 @@
/**
- * Pointer to the current read buffer.
+ * Pointer to the current write buffer.
*/
protected byte[] buf;
@@ -132,12 +134,6 @@
/**
- * HTTP header buffer.
- */
- protected byte[] headerBuffer;
-
-
- /**
* Underlying socket.
*/
protected long socket;
@@ -316,7 +312,6 @@
bbuf.clear();
socket = 0;
- buf = headerBuffer;
pos = 0;
lastActiveFilter = -1;
committed = false;
@@ -335,9 +330,6 @@
// Recycle Request object
response.recycle();
-
- // Determine the header buffer used for next request
- buf = headerBuffer;
// Recycle filters
for (int i = 0; i <= lastActiveFilter; i++) {
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org