Hello Mark,
I will send you the log and access-log to your email address. I am not sure whether it contradicts the observation. For example: - Browser opens a TCP-connection and requests the HTML page. - Tomcat sends single packages with HTML via http2-stream no 1. - Browser requests CSS via http2-stream no 2. - Tomcat serves HTML via stream 1 and css via stream 2. - Browser closes stream 2 which triggers tomcat to close the whole TCP connection including stream 1. - Thus the html stream is also cancelled, leading to a partly visible html page. I hope the logs will provide more information. Thanks! Thomas ________________________________ Von: Mark Thomas <ma...@apache.org> Gesendet: Dienstag, 20. September 2022 09:04 An: users@tomcat.apache.org Betreff: Re: AW: AW: AW: Tomcat 10 with Http2 and compression sometimes closes connection with Firefox On 19/09/2022 19:19, Thomas Hoffmann (Speed4Trade GmbH) wrote: > Hello Mark, > > thanks for the update. > > The commit looked promising. I tried with Tomcat 10.1 M17 but unfortunately > it didn't help. > > The partly loaded website is still occuring. > > > Setting http2 logging to fine, I can see the following stack: That looks like the client reset the stream but that doesn't match what you are observing which sounds like Tomcat is truncating the response. > 19-Sep-2022 20:07:16.651 FEIN [https-openssl-nio-443-exec-9] > org.apache.coyote.AbstractProcessor.setErrorState Error state [CLOSE_NOW] > reported while processing request > org.apache.coyote.CloseNowException: Connection [1], Stream [23], This stream > is not writable That this is happening with connection 1 is good. It means it should be easy to reproduce. Please can you: - enable debug logging for HTTP/2 - restart Tomcat - trigger this problem - provide the full debug logs I want to trace what is happening on the HTTP/2 connection leading up to the truncation occurring. Thanks, Mark > at org.apache.coyote.http2.Stream.doStreamCancel(Stream.java:258) > at > org.apache.coyote.http2.Http2UpgradeHandler.reserveWindowSize(Http2UpgradeHandler.java:919) > at org.apache.coyote.http2.Stream$StreamOutputBuffer.flush(Stream.java:945) > at org.apache.coyote.http2.Stream$StreamOutputBuffer.flush(Stream.java:891) > at org.apache.coyote.http2.Stream$StreamOutputBuffer.end(Stream.java:990) > at > org.apache.coyote.http11.filters.GzipOutputFilter.end(GzipOutputFilter.java:128) > at org.apache.coyote.http2.Http2OutputBuffer.end(Http2OutputBuffer.java:71) > at > org.apache.coyote.http2.StreamProcessor.finishResponse(StreamProcessor.java:230) > at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:391) > at org.apache.coyote.Response.action(Response.java:210) > at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:258) > at org.apache.catalina.connector.Response.finishResponse(Response.java:418) > at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:388) > at org.apache.coyote.http2.StreamProcessor.service(StreamProcessor.java:426) > at > org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) > at org.apache.coyote.http2.StreamProcessor.process(StreamProcessor.java:87) > at org.apache.coyote.http2.StreamRunnable.run(StreamRunnable.java:35) > at > org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) > at > org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) > at > org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) > at java.base/java.lang.Thread.run(Thread.java:833) > Caused by: org.apache.coyote.http2.StreamException: Connection [1], Stream > [23], This stream is not writable > at org.apache.coyote.http2.Stream.doStreamCancel(Stream.java:250) > ... 20 more > > > > Looks like the Exception bubbles up from the last line of tthis method: > > void doStreamCancel(String msg, Http2Error error) throws > CloseNowException { > StreamException se = new StreamException(msg, error, getIdAsInt()); > // Prevent the application making further writes > streamOutputBuffer.closed = true; > // Prevent Tomcat's error handling trying to write > coyoteResponse.setError(); > coyoteResponse.setErrorReported(); > // Trigger a reset once control returns to Tomcat > streamOutputBuffer.reset = se; > throw new CloseNowException(msg, se); > } > > The CloseNowException() bubbles up without being caught maybe (?) > Stream.write(...) is not contained here. > > Greetings, Thoas > > ________________________________ > Von: Mark Thomas <ma...@apache.org> > Gesendet: Montag, 19. September 2022 19:22 > An: users@tomcat.apache.org > Betreff: Re: AW: AW: Tomcat 10 with Http2 and compression sometimes closes > connection with Firefox > > Thomas, > > Please update to the latest 10.1.x release and re-test. There is what > looks like a fix for this issue in 10.1.0-M12: > > https://github.com/apache/tomcat/commit/b738fa6ee0e6789b104e652d95c982827e9753dd > > Mark > > > On 01/08/2022 21:46, Thomas Hoffmann (Speed4Trade GmbH) wrote: >> Hello, >> >> I would create a ticket and sum up all the collected information about this >> issue, if there are no further suggestions. >> >> Closing a single stream in http2 causes an internal exception in >> StreamProcessor which bubbles up in different ways, depending whether >> http-compression is active or not. >> In the first case it leads to closing the complete TCP connection. >> >> Thanks! Thomas >> >> >>> -----Ursprüngliche Nachricht----- >>> Von: Thomas Hoffmann (Speed4Trade GmbH) >>> <thomas.hoffm...@speed4trade.com.INVALID> >>> Gesendet: Donnerstag, 28. Juli 2022 22:25 >>> An: Tomcat Users List <users@tomcat.apache.org> >>> Betreff: AW: AW: Tomcat 10 with Http2 and compression sometimes closes >>> connection with Firefox >>> >>> Hello Mark, >>> >>> I got a stack trace which also shows the involvement of the gzip filter. I >>> set >>> the loglevel for the http2-StreamProcessor to get the details. >>> The stack trace was written when the problem with FF occurred. >>> FF closed one single stream in http2 connection and tomcat seemed to have >>> closed the whole TCP connection: >>> >>> 28-Jul-2022 22:16:40.939 FEIN [https-openssl-nio-443-exec-13] >>> org.apache.coyote.http2.StreamProcessor.process Connection [0], Stream >>> [23], An error occurred during processing that was fatal to the connection >>> java.lang.IllegalStateException: Connection [0], Stream >>> [23], Unable >>> to write to stream once it has been closed >>> at >>> org.apache.coyote.http2.Stream$StreamOutputBuffer.doWrite(Stream.java: >>> 880) >>> at >>> org.apache.coyote.http11.filters.GzipOutputFilter$FakeOutputStream.write( >>> GzipOutputFilter.java:158) >>> at >>> java.base/java.util.zip.GZIPOutputStream.finish(GZIPOutputStream.java:171 >>> ) >>> at >>> org.apache.coyote.http11.filters.GzipOutputFilter.end(GzipOutputFilter.java >>> :125) >>> at >>> org.apache.coyote.http2.Http2OutputBuffer.end(Http2OutputBuffer.java:71 >>> ) >>> at >>> org.apache.coyote.http2.StreamProcessor.finishResponse(StreamProcessor. >>> java:209) >>> at >>> org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:386) >>> at >>> org.apache.coyote.http2.StreamProcessor.service(StreamProcessor.java:420 >>> ) >>> at >>> org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.ja >>> va:65) >>> at >>> org.apache.coyote.http2.StreamProcessor.process(StreamProcessor.java:73 >>> ) >>> at >>> org.apache.coyote.http2.StreamRunnable.run(StreamRunnable.java:35) >>> at >>> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolE >>> xecutor.java:1136) >>> at >>> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPool >>> Executor.java:635) >>> at >>> org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThr >>> ead.java:61) >>> at >>> java.base/java.lang.Thread.run(Thread.java:833) >>> >>> I hope the stack shows the problem and helps to identify the problem. >>> Seems like the error handling has changed a bit with Tomcat 10.0.0 M8 with >>> http2 and is causing the issue. >>> >>> Thanks in advance! >>> Thomas >>> >>>> -----Ursprüngliche Nachricht----- >>>> Von: Thomas Hoffmann (Speed4Trade GmbH) >>>> <thomas.hoffm...@speed4trade.com.INVALID> >>>> Gesendet: Mittwoch, 27. Juli 2022 20:52 >>>> An: Tomcat Users List <users@tomcat.apache.org> >>>> Betreff: AW: AW: Tomcat 10 with Http2 and compression sometimes closes >>>> connection with Firefox >>>> >>>> Oh... I also discovered an additional message in the wireshark dump. >>>> Tomcat replied with a goaway packet with the text: >>>> Connection [22], Stream [19], An error occurred during processing >>>> that was fatal to the connection >>>> >>>>> -----Ursprüngliche Nachricht----- >>>>> Von: Thomas Hoffmann (Speed4Trade GmbH) >>>>> <thomas.hoffm...@speed4trade.com.INVALID> >>>>> Gesendet: Mittwoch, 27. Juli 2022 20:48 >>>>> An: Tomcat Users List <users@tomcat.apache.org> >>>>> Betreff: AW: AW: Tomcat 10 with Http2 and compression sometimes >>>>> closes connection with Firefox >>>>> >>>>> Hello Mark, >>>>> >>>>> I did some further investigations. I hope I don’t bother you with this >>> topic. >>>>> >>>>> I was trying to narrow down the tomcat version where the problem >>>>> started to appear. >>>>> The problem with the interrupted connection started with 10.0.0-M8 >>>>> With Tomcat 10.0.0-M7 everything works fine. >>>>> >>>>> Comparing the sources, there are some (maybe relevant) changes in >>>>> the >>>>> org.apache.coyote.http2 package from M7 --> M8: >>>>> - Http2AsynUpgradeHandler >>>>> - Http2UpgradeHandler >>>>> - Stream >>>>> - StreamProcessor >>>>> >>>>> The observed problem was, that the browser (firefox) was sending a >>>>> RST_Stream packet to close a single stream within the http2 protocol >>>>> and tomcat was closing the whole connection instead of closing just >>>>> that stream (wireshark dump would be available). >>>>> >>>>> In Stream.java a new method "doStreamCancel" was introduced (or an >>>>> old method was renamed) with release M8. >>>>> This looks related to the observed problem mentioned above. >>>>> >>>>> Does this information help to take a look again at this problem? >>>>> If I should try something or can assist with testing, just let me know. >>>>> >>>>> Thanks! >>>>> Thomas >>>>> >>>>> >>>>> >>>>> >>>>>> -----Ursprüngliche Nachricht----- >>>>>> Von: Thomas Hoffmann (Speed4Trade GmbH) >>>>>> <thomas.hoffm...@speed4trade.com.INVALID> >>>>>> Gesendet: Dienstag, 5. Juli 2022 09:59 >>>>>> An: Tomcat Users List <users@tomcat.apache.org> >>>>>> Betreff: AW: AW: Tomcat 10 with Http2 and compression sometimes >>>>>> closes connection with Firefox >>>>>> >>>>>> Hallo Mark, >>>>>> >>>>>>> -----Ursprüngliche Nachricht----- >>>>>>> Von: Mark Thomas <ma...@apache.org> >>>>>>> Gesendet: Montag, 4. Juli 2022 19:37 >>>>>>> An: users@tomcat.apache.org >>>>>>> Betreff: Re: AW: Tomcat 10 with Http2 and compression sometimes >>>>>>> closes connection with Firefox >>>>>>> >>>>>>> On 30/06/2022 07:40, Mark Thomas wrote: >>>>>>> >>>>>>> <snip/> >>>>>>> >>>>>>>> I think I'm going to need the sample app to investigate this. >>>>>>> >>>>>>> I have received the sample application and can recreate the issue. >>>>>>> >>>>>>> Going back to your original summary: >>>>>>> >>>>>>> <quote> >>>>>>> 1) Main page was requested by Firefox from Tomcat (GET ...) >>>>>>> 2) Tomcat sends the first compressed chunks of data to the >>>>>>> browser >>>>>>> 3) Firefox reads the first packages and notices, that additional >>>>>>> resources are needed (CSS, JS ...) >>>>>>> 4) While Tomcat is still sending the main page in chunks, the >>>>>>> browser is already requesting additional resources on other >>>>>>> channels >>>>>>> 5) Firefox is sending a RST_STREAM and closes that last >>>>>>> requested >>>>>>> stream(s) (dunno why it does request first and then closes the >>>>>>> channel) >>>>>>> 6) Tomcat is sending a GoAway message to the browser >>>>>>> 7) Tomcat stops also sending the main page (on a different >>>>>>> channel) </quote> >>>>>>> >>>>>>> I tested with 10.0.x. >>>>>>> >>>>>>> I don't see the above sequence. >>>>>>> >>>>>>> I ran the test 4 times, closing the browser between each test >>>>>>> >>>>>>> When things go wrong it appears that FireFox is re-using the >>>>>>> main page >>>>>>> (ticket.jsp) from a cache. >>>>>>> >>>>>>> I see the additional resources being requested and then cancelled. >>>>>>> >>>>>>> I do not see any GOAWAY messages from Tomcat. >>>>>>> >>>>>>> I do see a single GOAWAY message from the browser to Tomcat >>> when >>>>>>> I close the browser window (as expected). >>>>>>> >>>>>>> I don't see anything going wrong on the Tomcat side. >>>>>>> >>>>>>> At the moment, this looks to me like an issue with Firefox >>>>>>> rather than with Tomcat. >>>>>>> >>>>>>> If you can narrow the test case to something that shows Tomcat >>>>>>> doing something wrong, then I'd be happy to look at this again. >>>>>>> >>>>>>> Mark >>>>>>> >>>>>>> ---------------------------------------------------------------- >>>>>>> -- >>>>>>> -- >>>>>>> - >>>>>> >>>>>> Thank you very much for taking a look at it! >>>>>> >>>>>> I could also see that the browser cache is used sometimes. >>>>>> Sometimes the jsp is requested from the server, sometimes not. >>>>>> >>>>>> I did several tests again and the behaviour is not very >>>>>> consistent, thus it's hard to get a handle on the problem. >>>>>> I was also thinking about the possibility of a Firefox bug but >>>>>> this wouldn’t explain that: >>>>>> 1) It only happens with Tomcat 10.x and doesn’t show up with >>>>>> Tomcat 9.x >>>>>> 2) Users don’t report any problems with other internet websites >>>>>> (using >>>>>> Firefox) >>>>>> >>>>>> The GoAway seems to be sent from time to time by Tomcat, but not >>>>> always. >>>>>> I recorded one session which matches my last description: >>>>>> https://privfile.com/download.php?fid=62c3ec1170199-MTM2OTM= >>>>>> I set up another PC for testing, thus the IP addresses >>>>>> (source/target) differ and can be interpreted more easily. >>>>>> Maybe the last Capture was not readable without the keyfile, thus >>>>>> I exported it differently and it should be readable now. >>>>>> >>>>>> a) Is the behaviour according to the linked network trace an >>>>>> expected behaviour? (sending a GoAway after a rst_stream message) >>>>>> b) Have you been able to reproduce the error with Tomcat 9.x? >>>>>> >>>>>> If you have any hints or suggestions, how I could narrow it down, >>>>>> please drop a line. >>>>>> I don’t have any big or great ideas at the moment. >>>>>> >>>>>> Thank you very much! >>>>>> Thomas >>>>>> >>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org >>> For additional commands, e-mail: users-h...@tomcat.apache.org >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org >> For additional commands, e-mail: users-h...@tomcat.apache.org >> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org > For additional commands, e-mail: users-h...@tomcat.apache.org > > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org