mturk 2005/07/02 10:18:46
Modified: http11/src/java/org/apache/coyote/http11
Http11AprProcessor.java
util/java/org/apache/tomcat/util/net AprEndpoint.java
Log:
Fix the Sendfile implementation.
The APR sendfile always make it's internal full loop if the
socket timeout is larger then 0. Setting soket timeout to
zero also makes the socket nonblocking.
I have added a keepAlive flag to the sendfile data because with
sendfile the processing is done inside senfile poller.
Revision Changes Path
1.18 +6 -0
jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/Http11AprProcessor.java
Index: Http11AprProcessor.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/Http11AprProcessor.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- Http11AprProcessor.java 23 Jun 2005 11:47:32 -0000 1.17
+++ Http11AprProcessor.java 2 Jul 2005 17:18:46 -0000 1.18
@@ -884,9 +884,15 @@
// Do sendfile as needed: add socket to sendfile and end
if (sendfileData != null) {
sendfileData.socket = socket;
+ sendfileData.keepAlive = keepAlive;
if (!endpoint.getSendfile().add(sendfileData)) {
keepAlive = false;
+ openSocket = false;
}
+ else {
+ openSocket = true;
+ }
+ break;
}
}
1.54 +19 -10
jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/AprEndpoint.java
Index: AprEndpoint.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/AprEndpoint.java,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -r1.53 -r1.54
--- AprEndpoint.java 2 Jul 2005 10:55:34 -0000 1.53
+++ AprEndpoint.java 2 Jul 2005 17:18:46 -0000 1.54
@@ -1062,6 +1062,8 @@
public long socket;
// Position
public long pos;
+ // KeepAlive flag
+ public boolean keepAlive;
}
@@ -1147,10 +1149,10 @@
0, data.fdpool);
data.pos = data.start;
// Set the socket to nonblocking mode
- Socket.optSet(data.socket, Socket.APR_SO_NONBLOCK, 1);
+ Socket.timeoutSet(data.socket, 0);
while (true) {
long nw = Socket.sendfile(data.socket, data.fd, null,
null,
- data.pos, data.end, 0);
+ data.pos, data.end, 0);
if (nw < 0) {
if (!(-nw == Status.EAGAIN)) {
/* The socket will be destroyed on the
@@ -1167,7 +1169,7 @@
// Entire file has been send
Pool.destroy(data.fdpool);
// Set back socket to blocking mode
- Socket.optSet(data.socket,
Socket.APR_SO_NONBLOCK, 0);
+ Socket.timeoutSet(data.socket, soTimeout * 1000);
return true;
}
}
@@ -1182,7 +1184,7 @@
addS.add(data);
addS.notify();
}
- return false;
+ return true;
}
/**
@@ -1260,7 +1262,6 @@
// Close socket and clear pool
remove(state);
// Destroy file descriptor pool, which
should close the file
- Pool.destroy(state.fdpool);
// Close the socket, as the reponse would be
incomplete
Socket.destroy(state.socket);
continue;
@@ -1281,11 +1282,19 @@
state.pos = state.pos + nw;
if (state.pos >= state.end) {
remove(state);
- // Destroy file descriptor pool, which
should close the file
- Pool.destroy(state.fdpool);
- // If all done hand this socket off to a
worker for
- // processing of further requests
- getWorkerThread().assign(desc[n*2+1]);
+ if (state.keepAlive) {
+ // Destroy file descriptor pool, which
should close the file
+ Pool.destroy(state.fdpool);
+ Socket.timeoutSet(state.socket,
soTimeout * 1000);
+ // If all done hand this socket off to
a worker for
+ // processing of further requests
+ getWorkerThread().assign(state.socket);
+ }
+ else {
+ // Close the socket since this is
+ // the end of not keep-alive request.
+ Socket.destroy(state.socket);
+ }
}
}
} else if (rv < 0) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]