Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement better handling of a request in case a client abandoned it #1316

Closed
ipolevoy opened this issue May 17, 2024 · 0 comments
Closed

Implement better handling of a request in case a client abandoned it #1316

ipolevoy opened this issue May 17, 2024 · 0 comments

Comments

@ipolevoy
Copy link
Member

ipolevoy commented May 17, 2024

There is a strange case happens when a client requests a long download and then abandons the request. For instance, the download is taking 30 seconds, but the user closes the browser tab in the middle of the request. In case like that, ActiveWeb is catching this exception, and thinking that there is "something" wrong, is trying to render an error page. However, there is no browser to render it on, and it spirals with one exception after the other. Basically, this case was never considered :(.
The exceptions below are printed from a single request as a reaction to a browser abandoning it.

The goal of this task is to:

  1. Not treat this as a crisis
  2. Not print any exceptions
  3. Not log anything at the ERROR level
  4. Print something indicating that the client abandoned the request and just moved on. (at the INFO level)
"license_id":"XXXXXX"
"request_id":"30ca0b5a-e180-49c2-ae40-7c725179a143"
"session_id":"B020E356B822F6A491F0620868EF1A3D","user_id":"3793"}
"level":"INFO"
"logger":"org.javalite.activeweb.RequestDispatcher
"action":"searchDelinquency"
"controller":"app.controllers.rest.wholesaler.DelinquentController
duration_millis":210,
"error":"org.javalite.activeweb.WebException: Cannot return Writer because OutputStream was already served.; Cannot return Writer because OutputStream was already served."
"status":200
"url":"http://nyslapricepostings.com/rest/wholesaler/delinquent/searchDelinquency.txt"




level:"ERROR",
logger:"org.javalite.activeweb.RequestDispatcher",
message:"org.javalite.activeweb.WebException: Cannot return Writer because OutputStream was already served.; Cannot return Writer because OutputStream was already served.",
stacktrace:"org.javalite.activeweb.ControllerException: org.javalite.activeweb.WebException: Cannot return Writer because OutputStream was already served.; Cannot return Writer because OutputStream was already served.\\norg.javalite.activeweb.ControllerException: org.javalite.activeweb.WebException: Cannot return Writer because OutputStream was already served.; Cannot return Writer because OutputStream was already served.
at org.javalite.activeweb.DirectResponse.doProcess(DirectResponse.java:36)
at org.javalite.activeweb.ControllerResponse.process(ControllerResponse.java:54)
at org.javalite.activeweb.ControllerRunner.renderResponse(ControllerRunner.java:321)
at org.javalite.activeweb.ControllerRunner.run(ControllerRunner.java:69)
at org.javalite.activeweb.RequestDispatcher.doFilter(RequestDispatcher.java:210)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:169)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
at org.redisson.tomcat.UsageValve.invoke(UsageValve.java:71)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:670)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1786)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
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:63)
at java.base/java.lang.Thread.run(Unknown Source)\\nCaused by: org.javalite.activeweb.WebException: Cannot return Writer because OutputStream was already served.
at org.javalite.activeweb.HttpServletResponseProxy.getWriter(HttpServletResponseProxy.java:157)
at org.javalite.activeweb.DirectResponse.doProcess(DirectResponse.java:



level:"ERROR",
logger:"app.filters.CatchAllFilter",
message:"",

stacktrace:"org.javalite.activeweb.ControllerException: org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe; java.io.IOException: Broken pipe\\norg.javalite.activeweb.ControllerException: org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe; java.io.IOException: Broken pipe
at org.javalite.activeweb.ControllerRunner.executeAction(ControllerRunner.java:137)
at org.javalite.activeweb.ControllerRunner.executeController(ControllerRunner.java:82)
at org.javalite.activeweb.ControllerRunner.run(ControllerRunner.java:61)
at org.javalite.activeweb.RequestDispatcher.doFilter(RequestDispatcher.java:210)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:169)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
at org.redisson.tomcat.UsageValve.invoke(UsageValve.java:71)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:670)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1786)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
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:63)
at java.base/java.lang.Thread.run(Unknown Source)\\nCaused by: org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:345)
at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:780)
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:296)
at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:248)
at org.apache.catalina.connector.CoyoteOutputStream.close(CoyoteOutputStream.java:176)
at java.base/sun.nio.cs.StreamEncoder.implClose(Unknown Source)
at java.base/sun.nio.cs.StreamEncoder.lockedClose(Unknown Source)
at java.base/sun.nio.cs.StreamEncoder.close(Unknown Source)
at java.base/java.io.OutputStreamWriter.close(Unknown Source)
at org.apache.commons.csv.CSVPrinter.close(CSVPrinter.java:134)
at org.apache.commons.csv.CSVPrinter.close(CSVPrinter.java:118)
at app.controllers.rest.wholesaler.DelinquentController.searchDelinquency(DelinquentController.java:43)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.javalite.activeweb.ControllerRunner.executeAction(ControllerRunner.java:129)
... 23 more
Suppressed: org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
\\tat org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:345)
\\tat org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:780)
\\tat org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:296)
\\tat org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:248)
\\tat org.apache.catalina.connector.CoyoteOutputStream.close(CoyoteOutputStream.java:176)
\\tat app.controllers.rest.wholesaler.DelinquentController.searchDelinquency(DelinquentController.java:37)
\\t... 26 more
Caused by: java.io.IOException: Broken pipe
\\tat java.base/sun.nio.ch.SocketDispatcher.write0(Native Method)
\\tat java.base/sun.nio.ch.SocketDispatcher.write(Unknown Source)
\\tat java.base/sun.nio.ch.IOUtil.writeFromNativeBuffer(Unknown Source)
\\tat java.base/sun.nio.ch.IOUtil.write(Unknown Source)
\\tat java.base/sun.nio.ch.IOUti










level:"ERROR",
logger:"app.services.searches.AbstractSearch",
message: "Unable to write CSV record",
message:"java.io.IOException: Broken pipe",
stacktrace:"org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe\\norg.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:345)
at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:780)
at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:677)
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:380)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:358)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:103)
at java.base/sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)
at java.base/sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
at java.base/sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
at java.base/sun.nio.cs.StreamEncoder.lockedWrite(Unknown Source)
at java.base/sun.nio.cs.StreamEncoder.write(Unknown Source)
at java.base/sun.nio.cs.StreamEncoder.write(Unknown Source)
at java.base/java.io.Writer.write(Unknown Source)
at java.base/java.io.OutputStreamWriter.append(Unknown Source)
at java.base/java.io.OutputStreamWriter.append(Unknown Source)
at java.base/java.io.OutputStreamWriter.append(Unknown Source)
at org.apache.commons.csv.CSVFormat.printWithQuotes(CSVFormat.java:2132)
at org.apache.commons.csv.CSVFormat.print(CSVFormat.java:1863)
at org.apache.commons.csv.CSVFormat.print(CSVFormat.java:1850)
at org.apache.commons.csv.CSVPrinter.print(CSVPrinter.java:169)
at org.apache.commons.csv.CSVPrinter.printRecord(CSVPrinter.java:262)
at org.apache.commons.csv.CSVPrinter.printRecord(CSVPrinter.java:281)
at app.services.searches.AbstractSearch.lambda$printQueryResults$2(AbstractSearch.java:126)
at org.javalite.activejdbc.RowProcessor.processRS(RowProcessor.java:98)
at org.javalite.activejdbc.RowProcessor.with(RowProcessor.java:73)
at app.services.searches.AbstractSearch.printQueryResults(AbstractSearch.java:124)
at app.services.searches.WholesalerDelinquentSearch.exportToTxt(WholesalerDelinquentSearch.java:179)
at app.controllers.rest.wholesaler.DelinquentController.searchDelinquency(DelinquentController.java:42)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.javalite.activeweb.ControllerRunner.executeAction(ControllerRunner.java:129)
at org.javalite.activeweb.ControllerRunner.executeController(ControllerRunner.java:82)
at org.javalite.activeweb.ControllerRunner.run(ControllerRunner.java:61)
at org.javalite.activeweb.RequestDispatcher.doFilter(RequestDispatcher.java:210)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:169)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant