DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG·
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<
http://issues.apache.org/bugzilla/show_bug.cgi?id=42753>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND·
INSERTED IN THE BUG DATABASE.
http://issues.apache.org/bugzilla/show_bug.cgi?id=42753------- Additional Comments From sebster@sebster.com 2007-06-28 02:47 -------
(In reply to comment #5)
If you follow the code logic, if the error happens, where available() returns >0
after a READ has been invoked, the connection is never marked as a comet, so you
will not get the ERROR/END events invoked. so the connection goes into the
poller for the next request.
Could you see if you can work up a reproducible scenario, and we can take it
from there.
When I look in the code I see the following:
if (response.isClosed() || !request.isComet()) {
res.action(ActionCode.ACTION_COMET_END, null);
} else if (!error && read && request.getAvailable()) {
// If this was a read and not all bytes have been read, or
if no data
// was read from the connector, then it is an error
error = true;
log.error(sm.getString("coyoteAdapter.read"));
}
return (!error);
So when you get the error, the condition response.isClosed() ||
!request.isComet() must evaluate to false, which means that !response.isClosed()
&& request.isComet(). So for me to get the error it seems the request must
already be marked as a comet request.
I am not able to give you a small test case. The problem is that I have two
different products that start an embedded tomcat using exactly the same class,
and in one it consistently works (no errors whatsoever), and in the other it
consistently fails. I have not seen this issue before (and I have already done a
lot of testing in different situations), and I have no idea what the
precondition is for this issue to manifest itself.
However, I added extra debugging information, and I did find something strange.
I do the following logging FIRST thing in my Comet processor and I wrapped the
input stream to log which thread does the reading:
final EventType eventType = event.getEventType();
if (Debug.ENABLED && logger.isDebugEnabled()) {
try {
final Field field = request.getClass().getDeclaredField("request");
//$NON-NLS-1$
field.setAccessible(true);
final Request internalRequest = (Request) field.get(request);
logger.debug("{} event for request facade {}, request {}", new Object[] {
eventType, request, internalRequest }); //$NON-NLS-1$
} catch (final Exception e) {
logger.debug("{} event for request facade {}", eventType, request);
//$NON-NLS-1$
logger.debug("failed to get request", e); //$NON-NLS-1$
}
}
I set a breakpoint in the CoyoteAdapter where it gives the SEVERE error, looked
at the id of the request object, and checked my log what events I got for that
object.
My results where as follows:
2007-06-28 11:16:00,021 DEBUG [http-8080-exec-4]
com.sebster.myservlet.MyCometServlet - BEGIN event for request facade
org.apache.catalina.connector.RequestFacade@1dc696e, request
org.apache.catalina.connector.Request@18dbef1
This was the ONLY line in the log with Request@18dbef1. All the reads in this
BEGIN event happen on the http-8080-exec-4 thread. After returning from the read
(due to available() == 0), it immediately stops in my breakpoint in
CoyoteAdapter to log the SEVERE error. Note that I first set the break point to
find the id of the Request object to look for in the log.
The strange thing is, that the breakpoint happens in the http-8080-exec-5
thread. The comet field in the Request@1dc696e object is set to true, and
request.getAvailable() also returns true.
These are my observations so far. Note that I am no expert on Tomcat internals,
but I am very willing to spend time on this issue to resolve it, so any tips,
suggestions, questions, or assignments :-) are welcome!
To summarize:
1) I get a BEGIN event for Request@1dc696e in http-8080-exec-4
2) I read until available() == 0 in http-8080-exec-4
3) I return from the event() method in http-8080-exec-4
4) Tomcat logs a SEVERE error stating that I have not read all data
* The request object is Request@1dc696e
* request.isComet() == true
* request.getAvailable() == true
* the thread is http-8080-exec-5
* at this point there are zero log lines for thread http-8080-exec-5
Regards,
Sebastiaan
--
Configure bugmail:
http://issues.apache.org/bugzilla/userprefs.cgi?tab=email------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org